android action bar 多选操作 兼容2.X的方法

本文介绍在Android中使用ListView实现多选模式的两种方法:通过setMultiChoiceMode及利用ActionMode。重点讲解了如何自定义ActionMode.Callback类来加载上下文菜单,并通过子项点击事件更新选择状态。

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

大概有2种方式,1是用setMultiChocie方法,但是遗憾的是2.X版本不支持,最低版本要求是api11.

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

            @Override
            public boolean onCreateActionMode(android.view.ActionMode mode, Menu menu) {
                return false;
            }

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

            @Override
            public boolean onActionItemClicked(android.view.ActionMode mode, MenuItem item) {
                return false;
            }

            @Override
            public void onDestroyActionMode(android.view.ActionMode mode) {

            }
        });

无奈用第2种方式:mActionMode,虽然稍微麻烦点儿。

下面就主要介绍mActionMode形式的用法。

首先,长按时启动actionMode

listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                if (mActionMode == null) {
                    mActionMode = startSupportActionMode(new MyActionModeCallback());
                }

                return true;
            }
        });

其次,自定义ActionMode.Callback类,并在创建的回调里加载contextual menu

private class MyActionModeCallback implements ActionMode.Callback {
        @Override
        public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
            actionMode.getMenuInflater().inflate(R.menu.context_menu, menu);
            return true;
        }

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

        @Override
        public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
            return false;
        }

        @Override
        public void onDestroyActionMode(ActionMode actionMode) {
	list.get(position).setSelected(false);
	adapter.notifyDataSetChanged();
mActionMode = null; 

} }
然后,写listView的子项点击事件

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                if (mActionMode != null) {
                    LogCat.v(TAG + "position:" + position);
                    list.get(position).setSelected(!list.get(position).isSelected());

                    adapter.notifyDataSetChanged();

                }

            }
        });
然后,在适配器 getView方法里根据bool设置背景颜色。

if (list.get(position).isSelected()) {
            view.setBackgroundColor(context.getResources().getColor(R.color.blue_light));
        } else {
            view.setBackgroundColor(Color.TRANSPARENT);
        }


关键步骤就是上面的这几步。

还有几点注意:

注册监听时要绑定适配器。

mActionMode = startSupportActionMode(new MyActionModeCallback());

start的时候是有返回值的,要给mActionMode值,我就是因为忘了,所以导致长按后的子项点击事件没有log而纠结半天。


先写这么多,后续的多选完成后的删除操作明天加上。





                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值