【问题标题】:Android ListView Single Choice Mode with Action Mode带有动作模式的 Android ListView 单选模式
【发布时间】:2015-05-24 02:49:09
【问题描述】:

我想创建一个包含一个 ListView 的应用程序屏幕。 当用户在 ListView 项目上执行长按时,我想显示动作模式。我用下面的代码实现了它,得到了我想要的结果。

一个问题是我想让用户只选择一个列表项并在操作模式下选择上下文菜单项来执行操作。以下代码允许用户选择多个列表项。

android 不支持 ListView.CHOICE_MODE_SINGLE_MODAL 选择模式吗?我在谷歌上花了很多时间,但找不到任何实现的参考,它允许使用上下文操作模式的单选模式。请帮忙。

        mTestListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
        mTestListView.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() {
            @Override
            public void onItemCheckedStateChanged(ActionMode actionMode, int position, long l, boolean value) {
            }

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

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

            @Override
            public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
                switch (menuItem.getItemId()) {
                    case R.id.action_done:
                        Toast.makeText(getActivity(), "Done", Toast.LENGTH_SHORT).show();

                        actionMode.finish();
                        adapter.notifyDataSetChanged();
                        return true;
                    default:
                        return false;
                }
            }

            @Override
            public void onDestroyActionMode(ActionMode actionMode) {
            }
        });
    }

【问题讨论】:

    标签: android listview


    【解决方案1】:

    在您的方法中添加此代码。此代码将检查项目计数。如果计数超过一个,它将删除除最后一个之外的其他项目。

         public void onItemCheckedStateChanged(ActionMode mode, int position,
                                              long id, boolean checked) {
            int selectCount = mList.getCheckedItemCount();
    
            if(selectCount > 1){
    
                SparseBooleanArray checkarr = mList.getCheckedItemPositions();
                for(int i=0;i<dataList.size();i++){
                    /*
                    check item is checked
                    and not the last item
                    * */
                    if(checkarr.get(i) && position != i){
                        mList.setItemChecked(i, false);
                        break;
                    }
                }
            }
        }
    

    我在我的应用程序中尝试过。有用。 :)。希望这会对你有所帮助。

    【讨论】:

    • 感谢@Hein Htet Aung。你救了我:-)
    • 抱歉,我还有一个问题。当我在 onActionItemClicked(ActionMode actionMode, MenuItem menuItem) 中调用 mList.getSelectedItem() 时,总是返回 null。
    • 对不起,我的错误 :-( mList.getSelectedItem() 总是返回 null 并且我实现如下,我得到了正确的选择位置。谢谢 :-) 'for (int i = adapter.getCount () - 1; i >= 0; i--) { if (mList.isItemChecked(i)) { Cursor cursor = (Cursor) adapter.getItem(i);休息; } }'
    • 我觉得这种方式效果不好。如果我的 listView 数据大小超过 100500 个项目(通过 CursorAdapter)怎么办?在我看来,循环应该只在checkarr 条目上执行。
    • 是的,谢谢你的意见。 :)。这取决于情况。还有其他类似的解决方案,您可以将选中的项目保存在临时列表中,这样您就不需要搜索 100500 个项目来取消选中。
    猜你喜欢
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    • 1970-01-01
    • 2017-09-30
    • 2015-06-02
    • 2012-04-10
    相关资源
    最近更新 更多