检测哪个选定项(在ListView中)产生了ContextMenu(Android)

Jer*_*gan 56 android listview contextmenu

我有一个ListView,允许用户长按项目以获取上下文菜单.我遇到的问题是确定ListItem他们长期压迫的问题.我试过这样做:

myListView.setOnCreateContextMenuListener(new OnCreateContextMenuListener() {
  @Override public void onCreateContextMenu(ContextMenu menu, final View v, ContextMenuInfo menuInfo) {
   menu.add("Make Toast")
    .setOnMenuItemClickListener(new OnMenuItemClickListener() {
     @Override public boolean onMenuItemClick(MenuItem item) {
      String toastText = "You clicked position " + ((ListView)v).getSelectedItemPosition();
      Toast.makeText(DisplayScheduleActivity.this, toastText, Toast.LENGTH_SHORT).show();
      return true;
     }
    });
  } 
 });
Run Code Online (Sandbox Code Playgroud)

但它只是挂起,直到ANR弹出.我怀疑创建菜单后ListItem不再选择.

看起来您可以监控点击或长按,然后在那里记录点击的项目:

 mArrivalsList.setOnItemLongClickListener(new OnItemLongClickListener() {
  @Override public boolean onItemLongClick(AdapterView<?> parent, View v, int position, long id) {
   // record position/id/whatever here
   return false;
  }
 });
Run Code Online (Sandbox Code Playgroud)

但这对我来说感觉很重要.有没有人有更好的解决方案呢?

Eri*_*rke 75

我这样做.在我的onCreateContextMenu(...)方法中,我将其转换ContextMenu.ContextMenuInfoAdapterView.AdapterContextMenuInfo.从那里,您可以获得targetView,再次将其投射到窗口小部件.完整的代码在HomeActivity.java中可用,查找onCreateContextMenu(...)方法.

@Override
public void onCreateContextMenu(ContextMenu contextMenu,
                                View v,
                                ContextMenu.ContextMenuInfo menuInfo) {
    AdapterView.AdapterContextMenuInfo info =
            (AdapterView.AdapterContextMenuInfo) menuInfo;
    selectedWord = ((TextView) info.targetView).getText().toString();
    selectedWordId = info.id;

    contextMenu.setHeaderTitle(selectedWord);
    contextMenu.add(0, CONTEXT_MENU_EDIT_ITEM, 0, R.string.edit);
    contextMenu.add(0, CONTEXT_MENU_DELETE_ITEM, 1, R.string.delete);
}
Run Code Online (Sandbox Code Playgroud)

请注意,我将所选文本以及选择ID存储在私有字段中.由于UI是线程限制的,我知道selectedWord和selectedWordId字段对于以后的操作是正确的.

  • 这仅在项目背后的实际数据与从适配器创建的视图紧密相关时才有效.我发现这通常不是我创建的更复杂的适配器的情况(例如,它将显示图像和名称;点击它将打开有关该项目的更多详细信息,基于存储在适配器). (6认同)

Dan*_*Lew 67

首先,我想知道你是否通过使用使事情变得过于复杂View.setOnCreateContextMenuListener().如果您使用Activity.registerForContextMenu(),事情会变得更加容易,因为您可以使用Activity.onCreateContextMenu()Activity.onContextItemSelected()处理所有菜单事件.它基本上意味着您不必定义所有这些匿名内部类来处理每个事件; 您只需要覆盖一些Activity方法来处理这些上下文菜单事件.

其次,检索当前所选项目的方法肯定更简单.您需要做的就是保持ListViewAdapter用于填充它的或使用的引用.您可以使用ContextMenuInfo作为AdapterContextMenuInfo来获取项目的位置; 然后你可以使用ListView.getItemAtPosition()Adapter.getItem()检索Object专门链接到被点击的内容.例如,假设我正在使用Activity.onCreateContextMenu(),我可以这样做:

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);

    // Get the info on which item was selected
    AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;

    // Get the Adapter behind your ListView (this assumes you're using
    // a ListActivity; if you're not, you'll have to store the Adapter yourself
    // in some way that can be accessed here.)
    Adapter adapter = getListAdapter();

    // Retrieve the item that was clicked on
    Object item = adapter.getItem(info.position);
}

@Override
public boolean onContextItemSelected(MenuItem item) {
    // Here's how you can get the correct item in onContextItemSelected()
    AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
    Object item = getListAdapter().getItem(info.position);
}
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案.谢谢. (7认同)
  • 我欠你一杯啤酒! (3认同)