使用ActionMode实现ListView的多选功能

本文详细介绍了如何使用ActionMode实现ListView的多选功能。首先在布局中加入ListView,设置选择模式和回调事件。接着实现ActionMode菜单及自定义View,处理onItemCheckedStateChanged方法以响应item的选中状态变化。最后,通过Adapter类更新选中item的背景并在ActionMode中处理菜单点击事件,如删除和全选。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在平时的使用中,我们经常会用到ListView的多选功能,一般比较常见的方式是通过在itemView中加入一个checkBox来实现。其实ListView的API中提供了用于实现多选功能的相关接口。可以通过设置ListView的choiceMode属性来实现listview的item项在长按时激活多选的功能,再配合ListView.MultiChoiceModeListener的回调实现多选。
下面具体来看一下实现方法。

1. 在布局中加入一个listview控件

布局文件
然后在MainActivity中对这个listview进行初始化,下面是onCreate中的代码

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });

        mDatas = new ArrayList<>();
        for (int i = 0; i < 30; i++) {
            mDatas.add("Item " + i);
        }

        mAdapter = new MyAdapter(this, mDatas);

        mMultiChoiceListener = new MultiChoiceListener();

        mListView = (ListView) findViewById(R.id.lv);
        mListView.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE_MODAL);
        mListView.setMultiChoiceModeListener(mMultiChoiceListener);
    }

其中关键的代码是mListView.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE_MODAL);
mListView.setMultiChoiceModeListener(mMultiChoiceListener);

第一行是设置listview的选择模式,第二行是为listview设置一个多选时的回调事件。这个mMultiChoiceListener是一个实现了AbsListView.MultiChoiceModeListener接口的类。通过接口的名字就可以猜到这个一个在多选模式激活时候的回调,在这里我们可以处理多选时的逻辑。来看一下AbsListView.MultiChoiceModeListener里提供的几个方法:

class MultiChoiceListener implements AbsListView.MultiChoiceModeListener {

        @Override
        public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {
            Log.d(TAG, "onItemCheckedStateChanged");
        }

        @Override
        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            Log.d(TAG, "onCreateActionMode");
            return true;
        }

        @Override
        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
            Log.d(TAG, "onPrepareActionMode");
            return true;
        }

        @Override
        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
            Log.d(TAG, "onActionItemClicked");
            return false;
        }

        @Override
        public void onDestroyActionMode(ActionMode mode) {
            Log.d(TAG, "onDestroyActionMode");
        }
    }

完成上述的代码后,当我们长按listview的item时通过Log日志可以看到onCreateActionMode
onPrepareActionMode
onItemCheckedStateChanged

这三个方法执行了,
log
并且这时候手机的主界面也有了变化:
ActionMode started
可以看到在Toolbar上方又多出来了一条和Toolbar类似的东西(两个bar的位置问题后面会说到),这就是ListView的ActionMode模式。
而当我们点击左上角的箭头时,这个bar就会消失,并且会执行MultiChoiceListener中的onDestroyActionMode方法。
这就是一个完整的listview多选功能的激活和取消的过程,我们可以通过在MultiChoiceListener类中编写相关的逻辑实现listview的多选。

2. 实现ActionMode 菜单并为其设置CustomView.

在res/menu文件夹中创建menu_multi_choice.xml文件

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值