![](/img/trans.png)
[英]Android - weird problem with CheckBoxes in custom listview adapters?
[英]Checkboxes in android listview having problem
我有一個帶有自定義BaseAdapter的列表視圖,每行包含一個復選框和三個textview。 我正在使用Layoutinflater從xml文件中擴充此行。 但是,每次我選中一個復選框時,在整個列表中都會檢查許多其他復選框,而我想檢查的原始復選框有時會自行檢查,有時則不會。
每次用戶選中一個復選框時,我都會將該復選框附加的唯一值存儲在集合中。 下次調用getView方法時,我會根據復選框的值是否已經在集合中,在getView()內部返回視圖之前手動選中/取消選中該復選框。 但盡管如此,它仍然標記了這些復選框,即使這些復選框的checkedchangelistener沒有啟動。 我很懷疑這是因為在getView中重復使用了視圖,但是不知道什么是讓這整個工作變得有效的好方法。
避免if(convertView == null)和其他整個部分它肯定適合你。 謝謝。
問題肯定在你的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。
使用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是一個額外的偵聽器,可以由類的用戶添加。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.