首先第一个问题就是滑动checkbox会导致错乱,因为复用的原因,导致上一个check的还保持原有的状态,所以没有进行处理,上下滑动,就会导致错乱,解决如下:
定义HasMap,来记录checkbox的选中状态
private static HashMap<Integer, Boolean> isSelected;然后初始化都为未选状态
private void initDate() { for (int i = 0; i < beans.length; i++) { getIsSelected().put(i, false); } }点击时
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); } } notifyDataSetChanged(); } });
最后根据保存的状态值,设置选中状态
holder.cb.setChecked(getIsSelected().get(position));
以上完成错乱的bug解决,下面介绍关于数量限制的,当用户点击超过n个,则不让点方法和上面差不多,也是设置状态,不具体分开讲,请看
package com.example.listviewcheckboxdemo; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.CheckBox; import android.widget.TextView; import com.mrwu.demo.R; import java.util.HashMap; public class ListViewAdapter extends BaseAdapter { private Context context; private String[] beans; private int i=0; // 用来控制CheckBox的选中状况 private static HashMap<Integer, Boolean> isSelected; private static HashMap<Integer, Boolean> isClicked; class ViewHolder { TextView tvName; CheckBox cb; } public ListViewAdapter(Context context, String[] beans) { // TODO Auto-generated constructor stub this.beans = beans; this.context = context; isSelected = new HashMap<Integer, Boolean>(); isClicked = new HashMap<Integer, Boolean>(); initDate(); } private void initDate() { for (int i = 0; i < beans.length; i++) { getIsSelected().put(i, false); getIsClicked().put(i, true); } } @Override public int getCount() { // TODO Auto-generated method stub return beans.length; } @Override public Object getItem(int position) { // TODO Auto-generated method stub return beans[position]; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(final int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub // 页面 final ViewHolder holder; String bean = beans[position]; LayoutInflater inflater = LayoutInflater.from(context); if (convertView == null) { convertView = inflater.inflate( R.layout.listview_item_layout, 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)) { i--; isSelected.put(position, false); setIsSelected(isSelected); setAllClcik(); } else { if (i >= 4) { isClicked.put(position, false); setIsClickted(isClicked); }else { i++; setAllClcik(); isSelected.put(position, true); setIsSelected(isSelected); } } notifyDataSetChanged(); } }); // 根据isSelected来设置checkbox的选中状况 holder.cb.setClickable(getIsClicked().get(position)); holder.cb.setChecked(getIsSelected().get(position)); return convertView; } public static HashMap<Integer, Boolean> getIsSelected() { return isSelected; } public static HashMap<Integer, Boolean> getIsClicked() { return isClicked; } public static void setIsSelected(HashMap<Integer, Boolean> isSelected) { ListViewAdapter.isSelected = isSelected; } public static void setIsClickted(HashMap<Integer, Boolean> isClicked) { ListViewAdapter.isClicked = isClicked; } private void setAllClcik() { for (int i = 0; i < beans.length; i++) { getIsClicked().put(i, true); } } }