【问题标题】:Checkboxes in android listview having problemandroid listview中的复选框有问题
【发布时间】:2011-01-10 08:19:48
【问题描述】:

我有一个带有自定义 BaseAdapter 的列表视图,每行包含一个复选框和三个文本视图。我正在使用 Layoutinflater 从 xml 文件中扩充这一行。但是,每次我选中一个复选框时,都会在整个列表中选中许多其他复选框,而我想要检查的原始复选框有时会自行选中,有时不会。

每次用户选择一个复选框时,我都会将该复选框附加的唯一值存储在一个集合中。下次调用 getView 方法时,我根据复选框的值是否已经在集合中,在返回 getView() 中的视图之前手动选中/取消选中复选框。但是尽管这样做了,它仍然标记了这些复选框,即使这些复选框的 checkedchangelistener 没有启动。我对此表示怀疑,因为视图在 getView 中被重用,但不知道什么是让整个事情正常工作的好方法。

【问题讨论】:

标签: android listview checkbox


【解决方案1】:

避免 if (convertView==null) 和 else 整个部分 它肯定会为你工作。谢谢。

【讨论】:

  • 尽享 convertview 的好处。但这是一个快速修复
【解决方案2】:

问题肯定出在您的 getView() 方法中;

试试这样的

public View getView(int position, View convertView, ViewGroup parent) {
        View vu = convertView;
        ViewHolder vHolder = null;
        try {
            LayoutInflater inflater = (LayoutInflater) context
                    .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
            if (vu == null) {
                vu = (View) inflater.inflate(R.layout.list_fr_req, null);
                vHolder = new ViewHolder();
                vHolder.checkbox = (CheckBox) vu.findViewById(R.id.my_ChkBox);
                vu.setTag(vHolder);
            } else {
                vHolder = (ViewHolder) vu.getTag();
            }
            vHolder.checkbox.setOnCheckedChangeListener(this);

            vHolder.checkbox.setId(position);
            vHolder.textView.setId(position);

            if (myList.get(position).getCheckedStatus())
                vHolder.checkbox.setChecked(true);
            else
                vHolder.checkbox.setChecked(false);

        } catch (Exception e) {
            Log.d("Exception in getview", e + "");
            e.printStackTrace();
        }
        return vu;
    }

    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if (isChecked) {
            list.get(buttonView.getId()).setCheckedStatus(true);
        } else {
            list.get(buttonView.getId()).setCheckedStatus(false);
        }
    }

    public static class ViewHolder {
        CheckBox checkbox;
        TextView textview;
    }

问候: N_JOY。

【讨论】:

  • 我不确定,但是当你调用 vHolder.checkbox.setChecked(false); (在监听器中),系统不会再次调用 onCheckedChangeListener?
  • 嘿伙计,这是我的代码,它工作正常。这不是问题,我发布了答案。
  • 在某些Android手机中,setChecked()也会触发onCheckedChanged()被调用,会导致意想不到的结果。
【解决方案3】:

使用 OnClickListener 代替 OnCheckedChangeListener。即使您更新回收视图以匹配对象的值,也会触发后者。在下面的 getView() 代码中,我使用 HashMap 来存储对象 (itemMap) 的校验值。

            boolean checked=itemMap.get(currentObject);
            if(checked!=checkBox.isChecked())
                checkBox.setChecked(checked);
            checkBox.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    CheckBox checkBox1=(CheckBox)v;
                    if(checkBox1.isChecked()) //ckecked
                    {
                        itemMap.put(currentObject,true);
                        if(checkListener!=null)
                            checkListener.onCheck(position,convertView,parent,adapter);
                    }
                    else{ //unchecked
                        itemMap.put(currentObject,false);
                        if(checkListener!=null)
                            checkListener.onUnCheck(position,convertView,parent,adapter);
                    }
                }
            });

checkListener 是一个额外的监听器,可以由类的用户添加。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-10
    • 2021-06-15
    • 1970-01-01
    • 2017-07-09
    • 2011-09-15
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多