【问题标题】:Android CAB destroying after listview notifydatasetchangedAndroid CAB在listview notifydatasetchanged后销毁
【发布时间】:2017-03-06 08:02:47
【问题描述】:

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

下面是动作模式的代码

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;
                }
            });

任何帮助将不胜感激,在此先感谢。

【问题讨论】:

  • 尝试从 itemclick 中删除 mode.finish() 可能会阻止重新创建。
  • 请在此处添加日志以便查看
  • @parikdhakan mode.finish() in onActionItemClickedactionbar 中点击删除图标被调用,否则它不会在那里被调用。

标签: android listview android-cab


【解决方案1】:

您需要保存所选项目的 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 操作栏就可以了,只是变化不大)。

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

【讨论】:

  • 选择不是问题,因为我已经提到项目仍然被选中,所以我可以得到它们。问题是当列表刷新时 CAB 消失(有时两次),然后它变得可见。在调试时可以很容易地看到onCreateActionMode 在列表刷新期间再次被调用。如果您使用的是 Gmail,您会看到 CAB 在加载更多数据时不会破坏和重新创建。
猜你喜欢
  • 2013-01-08
  • 1970-01-01
  • 1970-01-01
  • 2014-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多