6

我有一个ListFragment与一个简单的ArrayAdapter. ListView 包含一个可检查项的列表,其 XML 布局如下:

<ListView android:id="@id/android:list"
              android:layout_width="match_parent"
              android:layout_height="0dip"
              android:layout_weight="1"
              android:layout_marginLeft="2mm"
              android:layout_marginRight="2mm"
              android:drawSelectorOnTop="false"
              android:longClickable="true"
              android:choiceMode="multipleChoiceModal"/>

如您所见,我在 XML 布局中设置了long-clickablechoicemode属性。

ListFragment我在的onViewCreated回调中设置了适当的侦听器:

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    ListView list_view = getListView();
    list_view.setMultiChoiceModeListener(this);
    list_view.setOnItemLongClickListener(this);
}

我作为侦听器参数传入,this因为我ListFragment还实现了这些侦听器的回调。

这是我遇到问题的回调:

@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id
{
    activity.startActionMode(this);
    return true;
}

首先,它onItemLongClick永远不会被调用。但是,当长按列表项时,上下文操作栏 (CAB) 会启动并完美运行!

事实上,CAB没有这个回调就可以正常启动!我的回调使用activity.startActionMode(this),它会显示 CAB,但不利于检查列表中的项目(我在其他地方测试过)。

如何以编程方式正确处理长单击以启动 CAB 并促进检查列表项?

我正在使用Android 开发人员指南主题中提供的方法(他们使用了 onLongClickListener,我也尝试过但无济于事),但它似乎不起作用。

4

1 回答 1

1

我猜你想出了这个,但是为了后代,你需要做的是添加上下文菜单只是在你的根活动/片段下的 onContextMenuCreated 中添加上下文菜单项:

@Override
public void onCreateContextMenu(ContextMenu menu, View v,
    ContextMenuInfo menuInfo) {
  if (v.getId()==R.id.list) {
    String[] menuItems = getResources().getStringArray(R.array.menu);
    for (int i = 0; i<menuItems.length; i++) {
      menu.add(Menu.NONE, i, i, menuItems[i]);
    }
  }
}

然后,响应下的上下文菜单点击onContextMenuCreated。你可以在这里阅读更多:

http://www.mikeplate.com/2010/01/21/show-a-context-menu-for-long-clicks-in-an-android-listview/

于 2013-07-26T12:34:48.870 回答