【问题标题】:CheckBox OnCheckedChangeListener() called after recycled?CheckBox OnCheckedChangeListener() 回收后调用?
【发布时间】:2015-04-13 15:43:13
【问题描述】:

问题

我创建了一个自定义 expandablelistadapter 以在单击子行时正确处理我的复选框。我在复选框中添加了一个 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;
}

【问题讨论】:

    标签: android checkbox expandablelistview expandablelistadapter


    【解决方案1】:

    一个简单的解决方案是在设置检查之前移除监听器,例如:

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

    【讨论】:

      【解决方案2】:

      您需要在 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);
      

      【讨论】:

      • 很抱歉,它没有在我的示例中显示我已经尝试过,但它也不起作用,因为复选框被非常随机地取消选中,这使得 object.checked 也被选中..所以下次我再次扩展该父(组)时,它是未选中的……我认为这是一种非常奇怪的行为……还有其他解决方案的想法吗?
      • 我添加了代码,以免其他人对同一件事感到困惑。
      • 这个方法对我有用,尽量避免tag,直接使用obj。这是我的例子github.com/gobozov/myshows/blob/master/src/ru/myshows/fragments/…
      • 那么,与其只使用静态的viewholder类,不如完成viewholder和对象? (我现在使用静态视图并保存 groupPosition/childPosition,然后使用组/子位置在 OnCheckedChangedListener 中查找我的“obj”。最终确定对象不会不必要地占用更多内存吗?因为我对对象的查找没有真的不需要那么多时间(不使用 asynctask atm)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多