首页 > 代码库 > 安卓如何实现list的全选效果
安卓如何实现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类型。
安卓如何实现list的全选效果