项目使用中listview多选或者说是PullToRefreshListView多选的个人解决方案

本文介绍了在项目中遇到的PullToRefreshListView多选问题的解决方案,重点在于如何准确记录和管理ListView中各条目的选中状态。通过HashMap存储选中状态,并在item的onItemClick方法中更新。同时,使用List记录选中项,以应对取消图标出现时的多选逻辑。在搜索过滤阶段,利用Filter类进行处理。提供了相关的代码逻辑和下载链接。

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

近期将会陆续分享、总结做过的项目中遇到的技术点,以便下次用到的时候可以快速的实现相关的功能~

下面介绍的是我在项目当中碰到的listview多选或者说是PullToRefreshListView(我目前用的上拉刷新,下拉加载更多的数据加载框架)的多选。

我相信很多人都会碰到多选的问题,一般item都会有CheckBox控件。另外也可以使用CheckedTextView控件(类CheckedTextView继承超类TextView并实现Checkable接口。当ListView的setChoiceMode方法并设定为CHOICE_MODE_SINGLE或者CHOICE_MODE_MULTIPLE,而非CHOICE_MODE_NONE时,使用此类是很有用的。以上为引用别人的话)。在这我用的是CheckBox控件
(一)
(一)

二
(二)

三
(三)

下面主要分析listview多选,PullToRefreshListView多选可在最后的下载链接的demo里面找到~
listview多选,个人认为关键在于准确记录选中或者没选中item的位置,这里我是用HashMap来存储选中或者没选中相关的状态
首先item的onItemClick方法里面:

        final List<String> members = new ArrayList<String>();
        mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                CheckBox checkBox = (CheckBox) view.findViewById(R.id.item_station_choose_checkbox);
                checkBox.toggle();
                mStringMap.put(mPickAdapter.getItem(position).stationId, checkBox.isChecked());

                //过滤状态
                if (mClearSearchBtn.getVisibility() == View.VISIBLE) { //搜索框最右边的"*"图标出现时候
                    if (choosedMembers != null && choosedMembers.size() > 0) {

                        int length = mPickAdapter.getCount();
                        if (length > 0) {
                            String username = mPickAdapter.getItem(position).stationId;
                            if (choosedMembers.contains(username)) {
                                choosedMembers.remove(username);
                            } else {
                                if (members.size() > 0) {
                                    if (members.contains(username)) {
                                        members.remove(username);
                                    } else {
                                        members.add(username);
                                    }

                                } else {
                                    members.add(username);
                                }

                            }

                        }
                    } else {
                        int length = mPickAdapter.getCount();
                        if (length > 0) {
                            for (int i = 0; i < length; i++) {
                                String username = mPickAdapter.getItem(i).stationId;
                                if (mStringMap.get(username)) {
                                    members.add(username);
                                }
                                if(members.size()>0 && !mStringMap.get(username) && members.contains(username) ){
                                    members.remove(username);
                                }
                            }
                        }
                    }

                } else {
                    final List<String> members = getToBeCurrentAddMembers();
                    if (members != null && members.size() > 0) {
                        choosedMembers.clear();
                        choosedMembers.addAll(members);
                    } else {
                        choosedMembers.clear();
                    }

                }

            }

        });

恩,上述代码有点长,我的思路是:
首先:

CheckBox checkBox = (CheckBox) view.findViewById(R.id.item_station_choose_checkbox);
                checkBox.toggle();
                mStringMap.put(mPickAdapter.getItem(position).stationId, checkBox.isChecked());

通过以上代码,在item选中或者没选中时,都用mStringMap记录点选后的状态
其次: List choosedMembers,用choosedMembers来记录取消图标(*)没出现时选中的item,List 里面的String类型对应的是你打算通过编号ID方式来查找对应item的 item的编号ID(原谅这里有点绕口,意思就是你想通过什么方式来查找对应的item,那么那个String就对应那个方式);
最后: 当取消图标()没出现时,其实相当于直接listview多选,没有搜索功能,所以,要先获取当前选中了哪些item,然后choosedMembers clear清空,重新赋值最新状态的数据。另外,当取消图标()出现时,分两种情况,第一种是:choosedMembers 不为空,那么当进入到搜索过滤阶段(即是取消图标(*)出现阶段),如果过滤到的item已经处于选中状态,那么就要将该item从choosedMembers 中移除,

 else {
     if (members.size() > 0) {
         if (members.contains(username)) {
             members.remove(username);
        } else {
             members.add(username);
        }
       } else {
           members.add(username);
       }
    }

上述中的members,我想起来了,是之前右上角title处的“确定”按钮还要加入一个统计选中item个数的小功能,下一篇文章再加上那功能了~~
第二种是:choosedMembers 为空,那么当进入到搜索过滤阶段(即是取消图标(*)出现阶段),其实里面的代码逻辑还是跟上面说的那样,是因为之前有一个统计选中item个数的小功能,所以可以暂时先忽略,不会影响到当前demo的整体逻辑~~
最后想说的是:搜索过滤方面,我用的是Filter类,具体逻辑看代码,应该容易理解,哈哈,偷懒一下~

下载链接:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值