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

原创 2016年05月31日 23:41:05

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

下面介绍的是我在项目当中碰到的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类,具体逻辑看代码,应该容易理解,哈哈,偷懒一下~

下载链接:

版权声明:本文为博主原创文章,未经博主允许不得转载。

ListView选中后错位问题及解决方案(含单选和多选)

一、单选错位 1、在监听处设置选中的位置 @Override public void onItemClick(AdapterView parent, View view, int position,...

PullToRefreshListView listview 单选多选

本文讲解如何实现PullToRefreshListView的多选,实现全选,取消全选功能. 同样也适用于普通的listview。 PullToRefreshListView与普通的listview的...

select多选解决方案

select多选实现(前后台交互数据选择和显示)
  • yanlzhl
  • yanlzhl
  • 2017年02月06日 17:42
  • 687

多选解决方案

【喜欢的运动】                                                                                            ...

Android项目开发经验小结----ListView的单选模式和多选模式

最近公司做的一个项目像下面的二级联动功能。 一开始什么都没想,直接就左边RadioGroup右边CheckBox。写完后发现,代码量实在太多了,而且看起来乱糟糟的。 突然想起,ListView的...

JQuery datatables 使用Fixedcolumns固定列控件 多选框选中问题解决方案

如题,JQuery datatables 使用Fixedcolmun 多选框选中问题解决方案,如果你恰好用到了固定前几列的插件,还有恰好要有多选的功能,你肯定会遇到类似于点击了表头,想全选下面的每行数...

【Android】ListView多选模式的使用

【关键词】 ListView 多选 【问题】 如何使用ListView的多选模式? 【效果图】 【分析】 长按某一个 item 的时候,开启多选模式,并让当前选择的 item 处于选中状态...

ListView中使用CheckedTextView实现多选

1.activity_main.xml  

美解决Android在listview添加checkbox实现单选多选操作问题

亲试,非常完美

解决Android自定义多选ListView乱序问题

正常情况下,自定义带CheckedBox的ListView的时候,如果Items的数目超过一个屏幕,你会发现被checked的Item在屏幕滚动之后会出现乱序现象。 出现这种乱序现象的原因可以参考如...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:项目使用中listview多选或者说是PullToRefreshListView多选的个人解决方案
举报原因:
原因补充:

(最多只允许输入30个字)