当旧 View 返回时,Android setOnCheckedChangeListener 再次调用

标签 android checkbox android-listview listener expandablelistview

我无法解决 getGroupView 方法的问题。

问题是监听器 setOnCheckedChangeListener 被多次调用。

假设我检查了某个复选框项目。然后我将它滚动到视野之外,然后再滚动回来。发生的事情是再次调用了监听器。问题是我将复选框 ID 存储在此监听器内的数组列表中,以便稍后在代码中使用它。结果是每次调用监听器时都会向数组列表添加更多元素并扭曲数据。

有解决办法吗?我应该怎么办?例如,我应该注销监听器吗?

@Override
 public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
     View view = null;

     final int group_position = groupPosition;
     if (convertView == null) {
         LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
         view = inflater.inflate(R.layout.activity_phrase, parent, false);
         final ViewHolder viewHolder = new ViewHolder();
         viewHolder.text = (TextView) view.findViewById(R.id.groupTitle);
         viewHolder.checkBox = (CheckBox) view.findViewById(R.id.check);
         viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                // TODO Auto-generated method stub

                if (buttonView.isChecked()) {
                    checked.add((Integer) viewHolder.checkBox.getTag());
                }
                else {
                    checked.remove((Integer) viewHolder.checkBox.getTag());
                }

            }
        });

        view.setTag(viewHolder);
        viewHolder.checkBox.setTag(groupPosition);

     } else {
         view = convertView;
         ((ViewHolder)view.getTag()).checkBox.setTag(groupPosition);
     }

     ViewHolder holder = (ViewHolder) view.getTag();
     holder.text.setText(titles[groupPosition]);

     for (int i = 0; i < checked.size(); i++) {
         if (checked.get(i) == group_position) {
             holder.checkBox.setChecked(true);
         }
         else if (checked.get(i) != group_position) {
             holder.checkBox.setChecked(false);
         }
     }

     return view;
 }

最佳答案

您使用的是哪个版本的 Android?

这似乎是多个组件的问题,尤其是使用 checkChange() 方法(CheckBox、RadioButton)时,我无法很好地解释为什么会发生这种情况。

我会假设是因为它记录了位置状态的变化并捕获了其他属性的变化?解决了类似问题 here

无论如何,解决此问题的方法是添加一个 OnClickListener()

CheckBox yourCheckBox = (CheckBox) findViewById (R.id.yourId);

yourCheckBox.setOnClickListener(new OnClickListener() {

      @Override
      public void onClick(View v) {
                //is chkIos checked?
        if (((CheckBox) v).isChecked()) {
                         //Case 1
        }
        else 
          //case 2

      }
    });

关于当旧 View 返回时,Android setOnCheckedChangeListener 再次调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17372750/

相关文章:

android - ListView 中的 ImageView 大小问题

javascript - 检查 Javascript 上复选框的状态何时更改

jquery - 复选框显示为未选中状态,尽管已选中

android - 在 Android 上的 OpenCV 中查找相机的框架参数

java - 如何自定义在分层模型中显示详细信息的搜索建议 UI

html - 是否可以将图像放入输入类型 ="check box"?

java - ArrayAdapter 和 ListView

java - 在 Android 中按下 ListView 中的内容时转到下一个布局

java - 将 gradle 项目导入为模块后,android studio 无法解析 Symbol R

android - 添加Firebase ML视觉时,gradle构建失败