真的很奇怪。第一次在eclipse中启动应用程序并调用startActionMode时,一切正常。如果我关闭应用程序并再次打开它,则startActionMode返回null。在我更改应用程序中的某些内容并从eclipse重新运行之前,它将始终返回null。在文档中,它说startActionMode如果被取消,则返回null,但是没有解释为什么取消它。

有任何想法吗?顺便说一句,我正在使用actionbarsherlock

更新:,如果我关闭手机或终止应用程序并再次启动应用程序,则可以使用...但是当我关闭并再次打开它时,会执行相同的操作。

这是我的代码:
ActionModeCallback类:

   class ActionModeCallback implements ActionMode.Callback{

    @Override
    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
          MenuInflater inflater = mode.getMenuInflater();
          inflater.inflate(R.menu.contextactiondownloads, menu);
          return true;
        }

    @Override
    public void onDestroyActionMode(ActionMode mode) {

    }

    @Override
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {

    }

    @Override
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
        // TODO Auto-generated method stub

        return false;
    }
};

在我的主要 Activity 中:
public ActionMode startActionMode()
{
    mActionMode = startActionMode(new ActionModeCallback());
    return mActionMode;
}

在我的listview适配器中:
 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                MainActivity activity = (MainActivity)rowView.getContext();
                if (isChecked) {

                    if(actionmode == null){
                        actionmode = activity.startActionMode();
                    }else
                    {
                        actionmode.invalidate();
                    }
                }
                else {
                        activity.finishActionMode();
                        actionmode=null;
                }
            }
        });

最佳答案

好吧,我不太了解为什么会发生在您身上。但是我创建了一个ListView,其行为与旧版Gmail的ListView相同。

基本上,用户可以通过长按项目之一来启动“选择模式”,然后,用户可以通过长按或单击项目的左侧来选择其他项目。复选框由适配器管理,方法是使其在“选择模式”中可见,而在未处于“选择模式”中时则不可见。您还可以通过检查是否选中了当前项目来对其进行检查。然后,使它不可单击,以便ListView可以获取触摸事件。

如果希望ListView在“选择模式”下启动,则可以将selectableFromTheBeginning设置为true。然后,使CheckBox从一开始就可见。我将使其更易于使用和稍后记录,但是我认为它现在可以使用。

这是SelectionListView的链接:

https://github.com/CyberEagle/OpenProjects/blob/master/android-projects/widgets/src/main/java/br/com/cybereagle/androidwidgets/view/SelectionListView.java

您还需要复制我的attrs.xml的一部分,该部分指定要通过XML设置的SelectionListView属性。

https://github.com/CyberEagle/OpenProjects/blob/master/android-projects/widgets/res/values/attrs.xml

要使用它,您可以实现SelectionListView.SelecionActionModeCallback而不是ActionMode.ActionModeCallback。记住要调用 parent 的方法。

您可以在XML中使用它,并按ID查找它。因此,您可以使用以下方法更改用户选择项目时出现的消息:

listView.setSelectedStringFormat("%d selected items");

您可以使用setActionModeCallback方法来设置SelectionListView.SelecionActionModeCallback的实现。

在适配器中,您可以执行以下操作:
checkBox.setChecked(listView.isItemChecked(position));

在您的ActionModeCallback中,您可以实现以下内容:
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
    SparseBooleanArray checkedItems = listView.getCheckedItemPositions();

    List<Item> selectedItems = new ArrayList<Item>();

    for (int i = 0; i < checkedItems.size(); i++) {
        if (checkedItems.valueAt(i)) {
            selectedItems.add(yourListOfItems.get(checkedItems.keyAt(i)));
        }
    }

    switch(item.getId()){
        case R.id.do_something:
            doSomething(selectedItems);
            mode.finish();
            break;
    }
}

您的复选框如下所示:
<CheckBox
    android:id="@+id/select"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:clickable="false"
    android:focusable="false"
    android:focusableInTouchMode="false" />

使用此小部件,您无需过多担心ActionMode或选择项目的方式。我对缺少文档感到抱歉。这是我在其他项目中使用的一些代码的存储库。我打算记录下来。您还可以在其中查看其他小部件。

如果使用此功能,请遵守Apache许可证。

10-07 18:43