[英]Custom listview with checkbox problem
我正在尝试创建一个自定义列表,其中包含允许您从列表中选择多个项目的复选框。
带有复选框的列表显示正常但如果我选中一个复选框,然后滚动列表中的其他项目也会被选中。
它与此处的问题基本相同
我知道它与android回收视图的方式有关但我不知道如何解决这个问题! 有人能帮帮我吗???
谢谢 - 迈克
您需要一个数据结构来跟踪检查哪些行。 这可以像bool[] checked
一样简单。
在getView
,确保将复选框状态设置为checked[position]
的内容。 您还应该在getView
的复选框上设置OnCheckedChangedListener ,以便他们使用checked[position] = isChecked
更新您的数据。
是的, ListView
中的行是循环使用的,因此在离开getView
之前,请确保填充行的所有相应数据。
您可以尝试为复选框实现OnClickListener而不是OnCheckChangedListener。 它对我有用。
检查下面的代码 -
public View getView(int position, View convertView, ViewGroup parent){
View view = convertView;
ViewHolder holder = new ViewHolder();
if(view == null){
view = inflater.inflate(R.layout.list_callcycle_blue, null);
holder.llContainer = (LinearLayout) view.findViewById(R.id.ll_container);
holder.lblLabel = (TextView) view.findViewById(R.id.txt_desc);
holder.cb = (CheckBox) view.findViewById(R.id.cb_store);
view.setTag(holder);
} else {
holder = (ViewHolder) view.getTag();
}
final Object data = getItem(position);
holder.lblLabel.setText(data.getDescription());
holder.cb.setTag(position);
holder.cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
int position = (Integer) buttonView.getTag();
objects.get(position).setChecked(buttonView.isChecked());
}
});
holder.cb.setChecked(isChecked(position));
return view;
}
请记住,使用change holder.cb.setOnCheckedChangeListener()
即在设置数据之前的任何监听器,在我们的例子中是holder.cb.setChecked()
原因:当我们滚动时,listview将回收视图,因此如果在侦听器之前使用setchecked,那么它将在旧侦听器的基础上选择值。 如果我们在监听器之后设置它,那么它将采用最新值
编辑部分下面的部分将展示如何用于检索已检查数据的isChecked()
和setChecked()
方法
/*
* This function is in your Custom Adapter Class
*/
private boolean isChecked(int position){
return object(position).isChecked();
}
/**
* Getter Setter Class / Data Model Class that defines your object
*/
private class MyObject{
private boolean isChecked;
private String a, b, c, orWhateverYourObjectNeeds;
public void setChecked(boolean isChecked){
this.isChecked = isChecked;
}
public boolean isChecked(){
return isChecked
}
}
创建一个ArrayList<Integer>
。 将OnCheckChangedListener
添加到您的复选框。 在更改的方法内,将列表视图position
添加或删除到ArrayList<Integer>
。
在getView
方法中,检查ArrayList<Integer>
包含当前列表视图position
。 如果它包含位置,则将checked设置为true,否则为false。
每次单击复选框时,都可以从ArrayList
添加或删除Integer
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.