在Android开发中我们接触比较多的控件就是ListView了 ,在使用ListView的时候也会遇到很多问题,今天我们就来聊聊,
当ListView中使用CheckBoxs时遇到的问题。
遇到的问题
当我们要在ListView中用CheckBox来实现一个多选的功能,但遇到了一个问题,当选中item时,滑动页面的时候出现了假选的情况,本来没有选中的item,滑动页面的时候选中了。
解决问题的思路
用HashMap来记录一个CheckBox的勾选记录
实现代码
由于ListView和CheckBox我们经常使用,布局代码和Activity的代码就不给出来了,只给出最关键的Adapter代码。
布局代码就是一个TextView用来显示名字,一个CheckBox用来勾选item.
ListViewAdapter的实现代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
| public class ListViewAdapter extends BaseAdapter { private Context context; private String[] beans; // 用来控制CheckBox的选中状况 private static HashMap<Integer, Boolean> isSelected; class ViewHolder { TextView tvName; CheckBox cb; } public ListViewAdapter(Context context, String[] beans) { this.beans = beans; this.context = context; isSelected = new HashMap<Integer, Boolean>(); // 初始化数据 initDate(); } // 初始化isSelected的数据 private void initDate() { for (int i = 0; i < beans.length; i++) { //初始化时将所有的选中记录清空 getIsSelected().put(i, false); } } @Override public int getCount() { return beans.length; } @Override public Object getItem(int position) { return beans[position]; } @Override public long getItemId(int position) { return position; } @Override public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder holder; String bean = beans[position]; LayoutInflater inflater = LayoutInflater.from(context); if (convertView == null) { convertView = inflater.inflate( R.layout.assist_device_binding_list_item, null); holder = new ViewHolder(); holder.cb = (CheckBox) convertView.findViewById(R.id.checkBox1); holder.tvName = (TextView) convertView .findViewById(R.id.tv_device_name); convertView.setTag(holder); } else { // 取出holder holder = (ViewHolder) convertView.getTag(); } holder.tvName.setText(bean); // 监听checkBox并根据原来的状态来设置新的状态 holder.cb.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { if (isSelected.get(position)) { isSelected.put(position, false); setIsSelected(isSelected); } else { isSelected.put(position, true); setIsSelected(isSelected); } } }); // 根据isSelected来设置checkbox的选中状况 holder.cb.setChecked(getIsSelected().get(position)); return convertView; } public static HashMap<Integer, Boolean> getIsSelected() { return isSelected; } public static void setIsSelected(HashMap<Integer, Boolean> isSelected) { ListViewAdapter.isSelected = isSelected; } }
|
用HashMap来记录一个CheckBox的勾选记录,每次滑动的时候CheckBox只需要读取HashMap里面的值,
再来进行显示,这样就不会出现假选的情况了。
欢迎大家关注我的微信公众号,我会不定期的分享些Android开发的技巧