关于ListView中加入并选取checkbox错位的问题

在ListView中的列表项中定义checkbox是一个常见手法,不过如果在listview使用了ViewHolder缓存的话就会遇到一个很恶心的问题,就是列表项错位的问题,为此我想到了一个自认为还算简单的解决方法,就是在自定义Adapter时加入checkbox.setTag(position)这样一句代码。这里checkbox为当前列表项的复选框,position为当前列表项位置。然后为checkbox设置点击事件,checkbox.setOnClickLinster(this)。最后在onClick(View v)方法中通过switch(v.getTag()){case 1: .......}方式设置点击事件

我的解决方法:
引入一个ArrayList列表,记录每一项当前的状态,然后在getView()中这样使用:holder.checkBox_3.setChecked(checkPosition_3.get(position));
具体看下面:

Java代码 复制代码  收藏代码
  1. private List checkPosition_3,checkPosition_1,checkPosition_0;   
  2.  class ListViewAdapter extends BaseAdapter{   
  3.         private Context context;   
  4.         public ListViewAdapter(Context context){   
  5.             this.context=context;   
  6.             checkPosition_3 = new ArrayList(ITEMS);   
  7.             checkPosition_1 = new ArrayList(ITEMS);   
  8.             checkPosition_0 = new ArrayList(ITEMS);   
  9.             for(int i=0;i
  10.                 checkPosition_3.add(false);   
  11.                 checkPosition_1.add(false);   
  12.                 checkPosition_0.add(false);   
  13.             }   
  14.         }   
  15.         public int getCount() {   
  16.             // TODO Auto-generated method stub   
  17.             return model.getItems().size();   
  18.         }   
  19.   
  20.         public Object getItem(int position) {   
  21.             // TODO Auto-generated method stub   
  22.             return model.getItems().get(position);   
  23.         }   
  24.   
  25.         public long getItemId(int position) {   
  26.             // TODO Auto-generated method stub   
  27.             return position;   
  28.         }   
  29.   
  30.         @Override  
  31.         public boolean isEnabled(int position) {   
  32.             // TODO Auto-generated method stub   
  33.             return false;   
  34.         }   
  35.         public View getView(int position, View convertView, ViewGroup parent) {   
  36.             // TODO Auto-generated method stub   
  37.             final ViewHolder holder;   
  38.             if(convertView==null){   
  39.                 holder=new ViewHolder();   
  40.                 convertView=LayoutInflater.from(context).inflate(R.layout.simple_list_item_zc14or9, null);   
  41.                 holder.serial = (TextView)convertView.findViewById(R.id.serial);//序号   
  42.                 holder.SS = (TextView)convertView.findViewById(R.id.SS);//赛事   
  43.                 holder.ZDandKD = (TextView)convertView.findViewById(R.id.ZDandKD);//主队 VS 客队   
  44.                 holder.BSSJ = (TextView)convertView.findViewById(R.id.BSSJ);//比赛时间   
  45.                    
  46.                 holder.checkBox_3 = (CheckBox)convertView.findViewById(R.id.checkBox_3);//   
  47.                 holder.checkBox_1 = (CheckBox)convertView.findViewById(R.id.checkBox_1);//   
  48.                 holder.checkBox_0 = (CheckBox)convertView.findViewById(R.id.checkBox_0);//   
  49.                    
  50.                 convertView.setTag(holder);   
  51.             }else{   
  52.                 holder = (ViewHolder) convertView.getTag();   
  53.             }   
  54.             ZC instance=model.getItems().get(position);   
  55.                
  56.             holder.serial.setText(instance.serial);   
  57.             holder.SS.setText(instance.SS);   
  58.             holder.ZDandKD.setText(instance.ZD+" VS "+instance.KD);   
  59.             holder.BSSJ.setText(instance.BSSJ);   
  60.                
  61.             //为了解决关于ListView+CheckBox,Item超过一屏时数据错乱   
  62.             holder.checkBox_3.setId(position);    
  63.             holder.checkBox_3.setChecked(checkPosition_3.get(position));   
  64.             holder.checkBox_3.setOnCheckedChangeListener(new OnCheckedChangeListener(){   
  65.   
  66.                 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {   
  67.                     // TODO Auto-generated method stub   
  68.                     int id = buttonView.getId();   
  69.                     checkPosition_3.set(id,isChecked); //赋值   
  70.                     updateTextViewInfo();   
  71.                 }   
  72.                    
  73.             });   
  74.             holder.checkBox_1.setId(position);    
  75.             holder.checkBox_1.setChecked(checkPosition_1.get(position));   
  76.             holder.checkBox_1.setOnCheckedChangeListener(new OnCheckedChangeListener(){   
  77.                    
  78.                 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {   
  79.                     // TODO Auto-generated method stub   
  80.                     int id = buttonView.getId();   
  81.                     checkPosition_1.set(id,isChecked); //赋值   
  82.                     updateTextViewInfo();   
  83.                 }   
  84.                    
  85.             });   
  86.             holder.checkBox_0.setId(position);    
  87.             holder.checkBox_0.setChecked(checkPosition_0.get(position));   
  88.             holder.checkBox_0.setOnCheckedChangeListener(new OnCheckedChangeListener(){   
  89.   
  90.                 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {   
  91.                     // TODO Auto-generated method stub   
  92.                     int id = buttonView.getId();   
  93.                     checkPosition_0.set(id,isChecked); //赋值   
  94.                     updateTextViewInfo();   
  95.                 }   
  96.                    
  97.             });   
  98.             return convertView;   
  99.         }   
  100.            
  101.         class ViewHolder {   
  102.             TextView serial;//序号   
  103.             TextView SS;//赛事   
  104.             TextView ZDandKD;//主队 VS 客队   
  105.             TextView BSSJ;//比赛时间   
  106.                
  107.             CheckBox checkBox_3,checkBox_1,checkBox_0;   
  108.         }   
  109.            
  110.     }  
private List checkPosition_3,checkPosition_1,checkPosition_0;
 class ListViewAdapter extends BaseAdapter{
    	private Context context;
    	public ListViewAdapter(Context context){
    		this.context=context;
    		checkPosition_3 = new ArrayList(ITEMS);
    		checkPosition_1 = new ArrayList(ITEMS);
    		checkPosition_0 = new ArrayList(ITEMS);
    		for(int i=0;i

我这里一个Item里面有3个CheckBox,所以有三个ArrayList列表。


关于ListView中加入并选取checkbox错位的问题_第1张图片

你可能感兴趣的:(关于ListView中加入并选取checkbox错位的问题)