问题
我创建了一个自定义的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;
}
发布于 2015-09-17 14:06:20
一个简单的解决方案是在设置选中之前删除监听程序,例如:
checkbox.setOnCheckedChangeListener(null);
checkBox.setChecked(obj.checked);
checkbox.setOnCheckedChangeListener(this);
发布于 2015-04-13 16:15:00
您需要在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);
https://stackoverflow.com/questions/29609535
复制相似问题