我正在尝试创建一个自定义列表,其中包含允许您从列表中选择多个项目的复选框。
带有复选框的列表显示正常,但是如果我勾选一个复选框,然后再滚动列表中的其他项目也会被检查。
它与here
基本相同我知道它与android回收视图的方式有关,但我不知道如何解决这个问题!有人可以帮助我吗?
谢谢 - 迈克
答案 0 :(得分:5)
您需要一个数据结构来跟踪检查哪些行。这可以像bool[] checked
一样简单。
在getView
中,请确保将复选框状态设置为checked[position]
的内容。您还应该在getView
的复选框中set an OnCheckedChangedListener,以便他们使用checked[position] = isChecked
更新您的数据。
是的,ListView
中的行已被回收,因此请确保在离开getView
之前填充一行的所有相应数据。
答案 1 :(得分:2)
您可以尝试为复选框实现OnClickListener而不是OnCheckChangedListener。它对我有用。
答案 2 :(得分:0)
创建ArrayList<Integer>
。在您的复选框中添加OnCheckChangedListener
。在更改后的方法中,将列表视图position
添加或删除到ArrayList<Integer>
。
在getView
方法中,检查ArrayList<Integer>
是否包含当前列表视图position
。如果它包含位置,则将checked设置为true,否则设置为false。
每次点击复选框时,都可以从Integer
添加或删除ArrayList
。
答案 3 :(得分:0)
检查以下代码 -
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;
}
请始终牢记,在设置数据之前使用更改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
}
}