我有一个列表视图,每行都有一个复选框,一次检查多个项目。当我向下滚动列表时,我的复选框会丢失状态(这意味着,我无法一次检查所有项目)
我在这里和互联网上阅读了很多帖子。人们说我必须将我的checkedItem存储在我已经尝试过的“ArrayList”中,但它没有用。目前,我将已检查状态与我列表中的所有其他内容一起存储在Object中。
这是我的适配器代码:
public class GalleryListAdapter extends BaseAdapter {
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
if (convertView == null) {
convertView = inflater.inflate(R.layout.gallery_list_item, parent, false);
holder = new ViewHolder();
// .. other stuff
holder.chkbox = (CheckBox) convertView.findViewById(R.id.chkbox);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.chkbox.setChecked(documents.get(position).isChecked());
holder.chkbox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
holder.chkbox.setChecked(holder.chkbox.isChecked() ? true : false);
documents.get(position).setChecked(holder.chkbox.isChecked() ? true : false);
}
}
}
}
向下滚动列表后,我的项目未选中,documents.get(checkedItemPosition).checked
为false
。有谁知道如何解决这个问题?
编辑 - 解决方案
感谢评论和回答,我找到了解决问题的方法:
if (convertView == null) {
holder.chkbox = (CheckBox) convertView.findViewById(R.id.chkbox);
convertView.setTag(R.id.chkbox, holder.chkbox);
}
holder.chkbox.setTag(position);
holder.chkbox.setChecked(documents.get(position).isChecked());
holder.chkbox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
int getPosition = (Integer) buttonView.getTag();
holder.chkbox.setChecked(buttonView.isChecked() ? true : false);
documents.get(getPosition).setChecked(buttonView.isChecked() ? true : false);
}
}
答案 0 :(得分:3)
设置标签为复选框持有者。
holder.chkbox.setTag(object);
并且在onCheckedChanged内执行此操作
**public onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
Object obj = ( Object)buttonView.getTag();
holder.chkbox.setChecked(obj.isChecked() ? true : false);
documents.get(position).setChecked(obj.isChecked() ? true : false);
}**
这将帮助您摆脱这个问题;)
答案 1 :(得分:2)
当我向下滚动列表时,我的复选框会丢失状态
ListView内部CheckBox的问题在于,由于滚动ListView而导致视图被回收,并且未维护Checkbox(检查或取消选中)的值。
要保持状态为CheckBox,我建议您使用TAG作为复选框。
holder.chkbox.setTag(position); // This line is important.
答案 2 :(得分:0)
这是因为当您滚动时,ListView会隐藏不在视图中的子项,这会导致CheckBox的状态被重置。如果您不需要在表格中构建复选框,则可以考虑使用ScrollView。