我有一个自定义BaseAdapter的列表视图,每行包含一个复选框和三个textview。我正在使用Layoutinflater从xml文件中扩充此行。但是,每次我选中一个复选框时,在整个列表中都会检查许多其他复选框,而我想检查的原始复选框有时会自行检查,有时则不会。
每次用户选中复选框时,我都会将该复选框附加的唯一值存储在集合中。下次调用getView方法时,我会根据复选框的值是否已经在集合中,在getView()内部返回视图之前手动选中/取消选中该复选框。但尽管如此,它仍然标记了这些复选框,即使这些复选框的checkedchangelistener没有启动。我很怀疑这是因为在getView中重复使用了这些视图,但是不知道什么是让这整个工作变得有效的好方法。
答案 0 :(得分:6)
避免if(convertView == null)和其他整个部分 它一定会对你有用。感谢。
答案 1 :(得分:3)
问题肯定在你的getView()方法中;
尝试这样的事情
public View getView(int position, View convertView, ViewGroup parent) {
View vu = convertView;
ViewHolder vHolder = null;
try {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
if (vu == null) {
vu = (View) inflater.inflate(R.layout.list_fr_req, null);
vHolder = new ViewHolder();
vHolder.checkbox = (CheckBox) vu.findViewById(R.id.my_ChkBox);
vu.setTag(vHolder);
} else {
vHolder = (ViewHolder) vu.getTag();
}
vHolder.checkbox.setOnCheckedChangeListener(this);
vHolder.checkbox.setId(position);
vHolder.textView.setId(position);
if (myList.get(position).getCheckedStatus())
vHolder.checkbox.setChecked(true);
else
vHolder.checkbox.setChecked(false);
} catch (Exception e) {
Log.d("Exception in getview", e + "");
e.printStackTrace();
}
return vu;
}
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
list.get(buttonView.getId()).setCheckedStatus(true);
} else {
list.get(buttonView.getId()).setCheckedStatus(false);
}
}
public static class ViewHolder {
CheckBox checkbox;
TextView textview;
}
问候: N_JOY。
答案 2 :(得分:0)
使用OnClickListener而不是OnCheckedChangeListener。即使您更新循环视图以匹配对象的值,也会触发后者。在getView()的下面一段代码中,我使用HashMap来存储对象的检查值(itemMap)。
boolean checked=itemMap.get(currentObject);
if(checked!=checkBox.isChecked())
checkBox.setChecked(checked);
checkBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
CheckBox checkBox1=(CheckBox)v;
if(checkBox1.isChecked()) //ckecked
{
itemMap.put(currentObject,true);
if(checkListener!=null)
checkListener.onCheck(position,convertView,parent,adapter);
}
else{ //unchecked
itemMap.put(currentObject,false);
if(checkListener!=null)
checkListener.onUnCheck(position,convertView,parent,adapter);
}
}
});
checkListener是一个额外的侦听器,可以由类的用户添加。