【问题标题】:Checkbox looses state on ListView scrolling复选框在 ListView 滚动时失去状态
【发布时间】:2014-04-22 08:20:25
【问题描述】:

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

我在这里和互联网上阅读了很多帖子。人们说我必须将我的checkedItems 存储在我已经尝试过但没有用的“ArrayList”中。目前,我将选中的状态与列表中的所有其他内容一起存储在一个对象中。

这是我的 Adapter` 的代码:

    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。有谁知道如何解决这个问题?

编辑 - 解决方案

感谢 cmets 和答案,我找到了解决问题的方法:

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

【问题讨论】:

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


【解决方案1】:

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

这将帮助您摆脱这个问题;)

【讨论】:

    【解决方案2】:

    当我向下滚动列表时,我的复选框会失去状态

    ListView 中 CheckBox 的问题在于,由于 ListView 的滚动而导致视图被回收,并且 Checkbox 的值(选中或取消选中)没有得到维护。

    为了,保持 CheckBox 的状态,我建议你使用 TAG 作为复选框。

    holder.chkbox.setTag(position); // This line is important.
    

    【讨论】:

      【解决方案3】:

      这是因为 ListView 在您滚动时隐藏了不在视图中的子项,这会导致 CheckBox 的状态被重置。如果您不需要在表格中构造复选框,则可以考虑改用 ScrollView。

      【讨论】:

      • 他应该为documents对象实现Parcelable吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-20
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-27
      • 2015-09-13
      相关资源
      最近更新 更多