安卓如何实现list的全选效果

背景:在做“购物车”和“我的关注”、“收货地址”这一类列表问题时,往往UI设计师会将外层Activity添加一个“全选”功能的checkbox(姑且叫他父checkbox),而子checkbox则存在于列表的每一个项,即listitem,而listitem往往写在一个adapter中。如何完成内外层,即内层adapter和外层Activity的传递呢?

外层Activity向内层adapter传递:

在本例中,需要实现的是外层Activity的父checkbox控件勾选后,将内层adapter中所有item的子checkbox全部标记为勾选状态。怎么做?首先在adapter中写一个chooseAll(boolean flag)的函数,而后在外层Activity调用。函数的内容即是遍历所有子项依次修改每一个子checkbox。最后不要忘记在函数里notifyDatasetChanged,来刷新adapter。


内层adapter向外层Activity传递:

严格上讲,adapter是无法控制外层Activity的,Activity可以调用adapter的函数,控制刷新等,内层adapter则完全无法控制外层Activity的加载。在这里我也是用了一种比较取巧的方法,来解决我面临的切实问题。在本例中,我需要做的就是根据内层adapter的子项item的子checkbox的情况来修改外层checkbox,即如果点击最后一个未选中的复选框之后,外层checkbox需要相应的变成选中状态。由于不方便开全局变量,甚至是开线程随时监听,所以就用了取巧的方式,将外层Activity的context作为adapter构造函数的参数传递进来,然后通过context获得父checkbox,在adapter选中最后一项后相应把该checkbox修改掉。如何通过context获得外部控件?利用了下面这句强制转型。

adapter.this.chooseAllImg = (ImageView) ((Activity)mContext).findViewById(R.id.chooseAll);

这样,adapter通过修改这个Img就可以达到修改外层Img的效果了,因为内外层Img都指向了同一个资源文件,即R.id.chooseAll。


问题又出现了:

这只是修改了外层Activity中checkbox的样子,逻辑上没有修改。如果一开始外层Activity全选flag为假,然后子项依次选中直至全部选中,这时adapter会修改外层Activity的checkbox图片,改为选中的图片,但是Activity本身局部变量 —— 全选flag仍然是假,因为adapter是无法通过context获得Activity的局部变量的。如果Activity接下来需要通过这个flag做一些判断,那逻辑上就走不通了,明明看起来是全部选中的图片,但是flag却依然写的是假。所以我的对策是:Activity不要用这个flag。用什么呢?唯一能保持通信的就是这个小小的checkbox Img,而取巧的是安卓的控件都可以实现一个叫Tag的东西,与每一个控件绑定。那么,我只要将Img的Tag设置为真假来代替这个flag就可以了。Tag怎么设置?很简单,只需要在内层全选情况成立时,setTag(true),而后在外层用到flag时,getTag(),就可以了。当然getTag需要转为Boolean类型。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值