ListView 通知数据集更改后Android CAB销毁

标签 android listview android-cab

我在 Listview 上使用 setMultiChoiceModeListener 调用操作模式来选择要删除的多个项目。在 ListView 滚动时,我从服务器加载更多数据并通知适配器。在 adapter 被通知后,Action Mode(如果被调用)被销毁并重新创建,这使得标题和选定的数组列表为空(您可以看到下图)。虽然 ListView 项目选择仍然存在。我希望 CAB 像我们在 Gmail 应用程序中看到的那样持久存在,它不会在加载更多数据时破坏。

enter image description here

下面是 Action 模式的代码

listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
            listView.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() {
                @Override
                public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {

                        Item mItem = adapter.items.get(position);
                        if (mItem.isSection()) {
                        } else {
                            mode.setTitle(listView.getCheckedItemCount() + " Selected");
                            EntryItem mEntryItem = (EntryItem) mItem;
                            orderid = mEntryItem.orderId;
                            if (checked) {
                                selectedIdList.add(orderid);
                            } else {
                                selectedIdList.remove(orderid);
                            }
                            // Toggle the state of item after every click on it
                            adapter.toggleSelection(position);
                    }
                }

                @Override
                public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
                    if (item.getItemId() == R.id.delete){

                        if (selectedIdList.size() > 0) {
                            deleteItems(selectedIdList);
                        }
                        mode.finish();
                        return true;
                    }
                    return false;
                }


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


                @Override
                public void onDestroyActionMode(ActionMode mode) {
                    actionMode = null;
                    if (selectedIdList.size() > 0) {
                        selectedIdList.clear();
                        adapter.mSelectedItemsIds.clear();
                    }
                }


                @Override
                public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
                    return false;
                }
            });

任何帮助将不胜感激,提前致谢。

最佳答案

您需要保存所选项目 ID,以便在刷新/通知适配器更改后保持状态并显示为所选项目,如下例所示:

1) https://androidperspective.wordpress.com/2013/04/17/contextual-action-bar-with-listview/

(它显示选择并将所选项目 ID 保存在数组中以保存状态)。

2) http://theopentutorials.com/examples/android/listview/android-contextual-action-bar-for-listview-item-deletion-using-actionbarsherlock/

(它显示了您想要删除的完整示例,只需使用 sherlock 操作栏,它只会有很小的变化)。

很高兴知道它是否对您有帮助。

关于 ListView 通知数据集更改后Android CAB销毁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40220188/

相关文章:

android - 在 Android 上的 Cordova 应用程序中的弹出窗口后面模糊

android - MVVMCross 是否有办法在单击 ListView 上的 ImageButton 时更改选择器?

asp.net - 如何在不受控件绑定(bind)的 ListView 上执行删除

android - 如何使上下文操作栏出现在底部

android - 我们如何在 Android 的上下文操作栏中显示后退按钮而不是完成(复选标记)按钮

Android 波纹效应 + 非按钮 View 的高度

android - 如何自定义分享 Intent ?

android - 我们可以在 Android 中使用缩放手势检测器进行缩放吗?

c# - 如何有效地过滤大型LIstViewItemCollection?