CheckBox OnCheckedChangeListener()回收后调用?

时间:2015-04-13 15:43:14

标签: android checkbox expandablelistview expandablelistadapter

问题

我创建了一个自定义expandablelistadapter,以便在单击childrow时正确处理我的复选框。我在复选框中添加了一个OnCheckedChangeListener,并将我想要操作的项目作为标记传递。当我点击的视图被回收时(我相信),奇怪的事情开始发生。我扩展了一个父项,然后标记我的孩子,这工作正常,然后当我折叠父项并展开另一个父项时,我点击了之前单击的子项的OnCheckedChangeListener。这不是真的一致,有时候效果很好,但有时却没有。

问题

是什么让我的复选框改变状态,我该如何避免它? 它工作正常,这些"随机"国家的变化。

非常简化的代码

@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {

    convertView = mLayoutInflater.inflate(R.layout.site_picker_list_item_child1, null);
    CheckBox checkbox = (CheckBox) convertView.findViewById(R.id.site_test_child_selected);

    final ObjectA obj = getChild(groupPosition, childPosition);
    checkbox.setTag(obj);
    checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener() {

        @Override
        public void onCheckedChanged(CompoundButton checkbox, boolean isChecked) {

            ((ObjectA)checkbox.getTag()).selected = isChecked;

            if (isChecked)
                Log.d(TAG, "CHECKED: " + ((ObjectA)checkbox.getTag()).name);
            else
                Log.d(TAG, "UNCHECKED: " + ((ObjectA)checkbox.getTag()).name);
            notifyDataSetChanged();
        }
    });

    return convertView;
}

public class ObjectA {
    String name = "Hello";
    Boolean selected = false;
}

2 个答案:

答案 0 :(得分:1)

一个简单的解决方案是在设置选中之前删除侦听器,例如:

checkbox.setOnCheckedChangeListener(null);
checkBox.setChecked(obj.checked);
checkbox.setOnCheckedChangeListener(this);

答案 1 :(得分:0)

您需要在ObjectA类中保持选中状态

例如

class ObjectA{
    boolean checked;
}
在getView方法中

  final ObjectA obj = getChild(groupPosition, childPosition);
    checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton checkbox, boolean isChecked){
                obj.checked = isChecked;
            }

        });

  checkBox.setChecked(obj.checked);