关于ListView与CheckBox的结合(第二版.精华版)

    技术2024-11-23  25

    关于通过ListView将数据绑定到复选框的问题的总结 问题来源: 1 选中第一页的第2,3个复选框,当翻到第二页的时候其相同位置也被选中   解决思路:绝不能依靠复选框的被选中来删除黑名单号码(原因见上面分析),而依靠哪个数据被选中来删除黑名单.那么怎么知道这个数据  是否被选中呢?就是通过             CheckBox的被选状态来提示用户的。所以说CheckBox只是起到一个显示作用!!   解决办法:自定义SimpleAdapter类,重写getView()方法。而且借用了外部的全局的balckNumberIsCheckedMap保存了每个电话号码的状态,初始时均未被选中。             重写getView()方法的目的:             (1)实现数据的绑定checkBox.setText(blacknumber);//这里就是绑定的实质。把这个电话号码绑定到了ListView的这个checkbox上             (2)为CheckBox赋予初始状态(初始状态均为未被选中)             boolean isChecked=balckNumberIsCheckedMap.get(id);             checkBox.setChecked(isChecked); 2 通过实现对于条目点击事件的监听,我们在点击条目的时候可知道是背后的那条数据被点击   即HashMap<String,Object> itemHashMap=(HashMap<String, Object>) lv.getItemAtPosition(position);于是就可以修改此号码在balckNumberIsCheckedMap中的状态   从而用此状态来决定复选框CheckBox的状态,这样的话点击几个条目去实现删除的时候遍历balckNumberIsCheckedMap查看哪些号码被选中,把选中的删除即可。   这样带来了第二个问题:点击条目的时候,其实没有真正地点击到条目,而是点击了复选框CheckBox,因为复选框的优先级很高。    解决办法:在布局文件中使复选框不可以被点击,不可以被触摸,不可以获得焦点!!!于是在点击条目的时候就真的是在点击条目了!!!!!!!!   于是可以这样处理条目点击事件:   (1) 在点击的时候切换复选框状态checkBox.toggle();每点击条目都会切换此状态;然后得到复选框现在的状态即boolean itemIsCheck=checkBox.isChecked();   (2) 得到当前被点击电话号码即HashMap<String,Object> itemHashMap=(HashMap<String, Object>) lv.getItemAtPosition(position);   (3) 得到号码的ID即int blackNumberId=(Integer) itemHashMap.get("id");   (4) 然后修改此号码在balckNumberIsCheckedMap中的状态即balckNumberIsCheckedMap.put(blackNumberId, itemIsCheck);   这样就实现了形式与内容的统一,复选框的状态发生了变化,而且正确体现了实际情况。   核心代码如下:                 checkBox.toggle();                 boolean itemIsCheck=checkBox.isChecked();//得到checkBox目前的状态   HashMap<String,Object> itemHashMap=(HashMap<String, Object>) lv.getItemAtPosition(position);//得到ListView被点击条目所绑定的HashMap     int blackNumberId=(Integer) itemHashMap.get("id");   balckNumberIsCheckedMap.put(blackNumberId, itemIsCheck);

      当我们执行删除的时候:其实就是去HashMap<Integer, Boolean> balckNumberIsCheckedMap看哪些数据被选中了,若被选中就删除它们。

     

     

    这个总结源自于小项目——来电小精灵

    最新回复(0)