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

关于通过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看哪些数据被选中了,若被选中就删除它们。

 

 

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

上一篇:Python实现PPPOE攻击工具


下一篇:C++第四课:类的使用(二)[个人见解]