Checkbox在ListView滚动时丢失状态

时间:2014-04-22 08:20:25

标签: android listview checkbox android-listview android-adapterview

我有一个列表视图,每行都有一个复选框,一次检查多个项目。当我向下滚动列表时,我的复选框会丢失状态(这意味着,我无法一次检查所有项目)

我在这里和互联网上阅读了很多帖子。人们说我必须将我的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).checkedfalse。有谁知道如何解决这个问题?

编辑 - 解决方案

感谢评论和回答,我找到了解决问题的方法:

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);
    }
}

3 个答案:

答案 0 :(得分:3)

在getView方法中为

设置标签为复选框持有者。

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。