首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在回收后调用CheckBox OnCheckedChangeListener()?

在回收后调用CheckBox OnCheckedChangeListener()?
EN

Stack Overflow用户
提问于 2015-04-13 23:43:14
回答 2查看 477关注 0票数 1

问题

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

问题

是什么让我的复选框改变了状态,我如何避免它?除了这些状态的“随机”变化外,它工作得很好。

非常简化的代码

代码语言:javascript
运行
复制
@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;
}
EN

回答 2

Stack Overflow用户

发布于 2015-09-17 22:06:20

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

代码语言:javascript
运行
复制
checkbox.setOnCheckedChangeListener(null);
checkBox.setChecked(obj.checked);
checkbox.setOnCheckedChangeListener(this);
票数 2
EN

Stack Overflow用户

发布于 2015-04-14 00:15:00

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

例如

代码语言:javascript
运行
复制
class ObjectA{
    boolean checked;
}

getView方法中

代码语言:javascript
运行
复制
  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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29609535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档