首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

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

2012-06-28 
关于ListView中加入并选取checkbox错位的问题在ListView中的列表项中定义checkbox是一个常见手法,不过如果

关于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 stubreturn model.getItems().size();}public Object getItem(int position) {// TODO Auto-generated method stubreturn model.getItems().get(position);}public long getItemId(int position) {// TODO Auto-generated method stubreturn position;}@Overridepublic boolean isEnabled(int position) {// TODO Auto-generated method stubreturn false;}public View getView(int position, View convertView, ViewGroup parent) {// TODO Auto-generated method stubfinal 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 stubint 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 stubint 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 stubint 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>列表。




热点排行