关于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<Boolean>列表,记录每一项当前的状态,然后在getView()中这样使用:holder.checkBox_3.setChecked(checkPosition_3.get(position));
具体看下面:

private List<Boolean> checkPosition_3,checkPosition_1,checkPosition_0;
 class ListViewAdapter extends BaseAdapter{
    	private Context context;
    	public ListViewAdapter(Context context){
    		this.context=context;
    		checkPosition_3 = new ArrayList<Boolean>(ITEMS);
    		checkPosition_1 = new ArrayList<Boolean>(ITEMS);
    		checkPosition_0 = new ArrayList<Boolean>(ITEMS);
    		for(int i=0;i<ITEMS;i++){
    			checkPosition_3.add(false);
    			checkPosition_1.add(false);
    			checkPosition_0.add(false);
    		}
    	}
		public int getCount() {
			// TODO Auto-generated method stub
			return model.getItems().size();
		}

		public Object getItem(int position) {
			// TODO Auto-generated method stub
			return model.getItems().get(position);
		}

		public long getItemId(int position) {
			// TODO Auto-generated method stub
			return position;
		}

		@Override
		public boolean isEnabled(int position) {
			// TODO Auto-generated method stub
			return false;
		}
		public View getView(int position, View convertView, ViewGroup parent) {
			// TODO Auto-generated method stub
			final ViewHolder holder;
			if(convertView==null){
				holder=new ViewHolder();
				convertView=LayoutInflater.from(context).inflate(R.layout.simple_list_item_zc14or9, null);
				holder.serial = (TextView)convertView.findViewById(R.id.serial);//序号
				holder.SS = (TextView)convertView.findViewById(R.id.SS);//赛事
				holder.ZDandKD = (TextView)convertView.findViewById(R.id.ZDandKD);//主队 VS 客队
				holder.BSSJ = (TextView)convertView.findViewById(R.id.BSSJ);//比赛时间
				
				holder.checkBox_3 = (CheckBox)convertView.findViewById(R.id.checkBox_3);//
				holder.checkBox_1 = (CheckBox)convertView.findViewById(R.id.checkBox_1);//
				holder.checkBox_0 = (CheckBox)convertView.findViewById(R.id.checkBox_0);//
				
				convertView.setTag(holder);
			}else{
				holder = (ViewHolder) convertView.getTag();
			}
			ZC instance=model.getItems().get(position);
			
			holder.serial.setText(instance.serial);
			holder.SS.setText(instance.SS);
			holder.ZDandKD.setText(instance.ZD+" VS "+instance.KD);
			holder.BSSJ.setText(instance.BSSJ);
			
			//为了解决关于ListView+CheckBox,Item超过一屏时数据错乱
			holder.checkBox_3.setId(position); 
			holder.checkBox_3.setChecked(checkPosition_3.get(position));
			holder.checkBox_3.setOnCheckedChangeListener(new OnCheckedChangeListener(){

				public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
					// TODO Auto-generated method stub
					int id = buttonView.getId();
					checkPosition_3.set(id,isChecked); //赋值
					updateTextViewInfo();
				}
				
			});
			holder.checkBox_1.setId(position); 
			holder.checkBox_1.setChecked(checkPosition_1.get(position));
			holder.checkBox_1.setOnCheckedChangeListener(new OnCheckedChangeListener(){
				
				public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
					// TODO Auto-generated method stub
					int id = buttonView.getId();
					checkPosition_1.set(id,isChecked); //赋值
					updateTextViewInfo();
				}
				
			});
			holder.checkBox_0.setId(position); 
			holder.checkBox_0.setChecked(checkPosition_0.get(position));
			holder.checkBox_0.setOnCheckedChangeListener(new OnCheckedChangeListener(){

				public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
					// TODO Auto-generated method stub
					int id = buttonView.getId();
					checkPosition_0.set(id,isChecked); //赋值
					updateTextViewInfo();
				}
				
			});
			return convertView;
		}
    	
		class ViewHolder {
			TextView serial;//序号
			TextView SS;//赛事
			TextView ZDandKD;//主队 VS 客队
			TextView BSSJ;//比赛时间
			
			CheckBox checkBox_3,checkBox_1,checkBox_0;
        }
		
    }

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


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


如果在ListView中存在EditText的话,也会存在错乱问题。
解决方法 http://blog.sina.com.cn/s/blog_80f8936801012cp7.html
虽然也不那么优美!

你可能感兴趣的:(ListView,checkbox)