带checkBox的ListView全选和取消。

来源:互联网 发布:什么手机支持联通4g网络 编辑:程序博客网 时间:2024/05/19 12:15

       今天的需求是,一个带有checkBox的listView列表,通过点击全选,listView中每一个Item的checkBox项都选择上,反之,则取消全部。

      思路: listView是负责show数据的,所以我们尽量不在数据适配器里操作数据。因为全选或者取消全选,单独选择一个或者多个都是操作数据,我们可以专门为这组数据准备个容器。选择了一条数据就往容器里添加一条,选择了全部就全部添加进去,若取消选择,就把容器中的数据全部倒出去。这么做还有一个原因时,listView在展示多条数据时,选择之后再滚动发现数据状态也可以保存。

      实际操作:

  1. 定义一个List集合,selectList,这就是那个容器。
  2. 全选时:将服务器返回的数据通过for循环依次add 到selectList集合里。取消全部时,调用selectList.clear()即可;
  3. 选择单个或者多个时,直接调用selectList的add方法;在取消单个选择时,我们只要去selectList集合里判断下有没有当前对象。
  4. 最后把这个selectList集合传给数据适配器就可以了,在适配器里只需要监听点击事件。

       在这个需求里容易出问题的地方有以下几点:

  1.  如何判定当前对象是否存在于selectList集合,大家可能知道list有contains方法,也许会说这下简单了,只要通过这个方法我们就能判断了,实际上用这个方法去判断是没错的,出错的地方在contains方法,通过源码可以知道contains方法在比较两个对象时 用的是equals(),实际上equals()在比较两个字符串时效果很好,但是在这儿效果不好,两个对象比较完之后失效了,解决办法是,重写该对象的equals()方法吗,通过比较两个对象的唯一标识,例如id,返回比较结果。
  2. 只有全部选择了, 页面最上方的全部这个标识才能被选择。一开始我用了checkBox的setOnCheckedChangeListener来监听,后来发现我全选之后再取消某一个,最上方的全选按钮的状态没有变,还是之前的全选。解决办法时,调用onClickListener这个方法。同时在监听单个item的点击事件中,增加一个判断,就是selectList的size与list的size进行比较,相同全选按钮被选中,反之,不选。
  3. listView中最好不适用checkBox,因为会抢焦点(日后再分析)。解决方案时我们可以通通用ImageView来替代。
 













0 0