使用ActionMode实现ListView的多选功能

在平时的使用中,我们经常会用到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:a
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
实现RecyclerView的多选功能,可以按照以下步骤进行: 1. 首先,在RecyclerView的Adapter中定义一个Boolean类型的数组来保存每个item的选中状态: ```kotlin val selectedItems = BooleanArray(itemCount) ``` 2. 在RecyclerView的ViewHolder中,为itemView设置点击事件,当item被点击时,改变其选中状态: ```kotlin itemView.setOnClickListener { selectedItems[adapterPosition] = !selectedItems[adapterPosition] itemView.isSelected = selectedItems[adapterPosition] } ``` 3. 在RecyclerView的Adapter中,添加一个方法来获取所有被选中的item的位置: ```kotlin fun getSelectedItems(): List<Int> { val selected = mutableListOf<Int>() for (i in selectedItems.indices) { if (selectedItems[i]) { selected.add(i) } } return selected } ``` 4. 最后,在Activity或Fragment中,为RecyclerView设置一个OnTouchListener,当长按某个item时,进入多选模式: ```kotlin val touchListener = object : OnTouchListener { private val gestureDetector = GestureDetector(this@MyActivity, object : GestureDetector.SimpleOnGestureListener() { override fun onLongPress(e: MotionEvent?) { super.onLongPress(e) recyclerView.startActionMode(actionModeCallback) } }) override fun onTouch(v: View?, event: MotionEvent?): Boolean { gestureDetector.onTouchEvent(event) return false } } recyclerView.setOnTouchListener(touchListener) ``` 5. 在ActionMode.Callback中,处理多选模式下的各种操作: ```kotlin val actionModeCallback = object : ActionMode.Callback { override fun onCreateActionMode(mode: ActionMode?, menu: Menu?): Boolean { mode?.menuInflater?.inflate(R.menu.menu, menu) return true } override fun onPrepareActionMode(mode: ActionMode?, menu: Menu?): Boolean { return false } override fun onActionItemClicked(mode: ActionMode?, item: MenuItem?): Boolean { when (item?.itemId) { R.id.menu_delete -> { val selectedItems = adapter.getSelectedItems() for (i in selectedItems.reversed()) { adapter.removeItem(i) } mode?.finish() return true } // other menu items } return false } override fun onDestroyActionMode(mode: ActionMode?) { adapter.notifyDataSetChanged() } } ``` 以上就是实现RecyclerView多选的基本步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值