旧视图返回时,Android setOnCheckedChangeListener再次调用

旧视图返回时,Android setOnCheckedChangeListener再次调用,android,checkbox,android-listview,listener,expandablelistview,Android,Checkbox,Android Listview,Listener,Expandablelistview,我无法使用getGroupView方法解决问题 问题是监听器setOnCheckedChangeListener被多次调用 假设我选中了某个复选框项。然后我将其从视图中滚动出来,然后向后滚动。发生的事情是,监听器再次被调用。问题是我将复选框id存储在这个监听器的arraylist中,以便以后在代码中使用它。结果是,每次调用侦听器并扭曲数据时,都会向arraylist添加更多元素 有解决办法吗?我该怎么办?例如,我应该注销侦听器吗 @Override public View getGroupVi

我无法使用getGroupView方法解决问题

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

假设我选中了某个复选框项。然后我将其从视图中滚动出来,然后向后滚动。发生的事情是,监听器再次被调用。问题是我将复选框id存储在这个监听器的arraylist中,以便以后在代码中使用它。结果是,每次调用侦听器并扭曲数据时,都会向arraylist添加更多元素

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

@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;
 }
@覆盖
公共视图getGroupView(int groupPosition、布尔isExpanded、视图convertView、视图组父级){
视图=空;
最终整数组位置=组位置;
if(convertView==null){
LayoutFlater充气器=(LayoutFlater)context.getSystemService(context.LAYOUT\u充气器\u服务);
视图=充气机。充气(R.layout.activity\u短语,父项,false);
最终ViewHolder ViewHolder=新的ViewHolder();
viewHolder.text=(TextView)view.findViewById(R.id.groupTitle);
viewHolder.checkBox=(checkBox)view.findViewById(R.id.check);
viewHolder.checkBox.setOnCheckedChangeListener(新建CompoundButton.OnCheckedChangeListener()){
@凌驾
检查更改后的公共无效(复合按钮视图,布尔值已检查){
//TODO自动生成的方法存根
if(buttonView.isChecked()){
选中。添加((整数)viewHolder.checkBox.getTag());
}
否则{
选中。删除((整数)viewHolder.checkBox.getTag());
}
}
});
view.setTag(viewHolder);
viewHolder.checkBox.setTag(groupPosition);
}否则{
视图=转换视图;
((ViewHolder)view.getTag()).checkBox.setTag(groupPosition);
}
ViewHolder=(ViewHolder)view.getTag();
holder.text.setText(标题[groupPosition]);
对于(int i=0;i
您使用的是什么版本的Android


对于多个组件来说,这似乎是一个问题,尤其是对于checkedChange()方法(CheckBox,RadioButton),我无法很好地解释为什么会发生这种情况

我会假设,因为它记录了位置状态的变化,并获取了其他属性的变化?讨论了一个类似的问题

在任何情况下,都可以通过添加
OnClickListener()
来解决此问题


我也面临着同样的问题,我花了好几个小时才看到所有与此相关的讨论。我试图通过保持沉默来解决这个问题
viewHolder.checkBox.setTag(groupPosition)

viewHolder.checkBox.setOnCheckedChangeListener(新建CompoundButton.OnCheckedChangeListener()
此侦听器之前的语句。并且代码完全按照预期工作。

将以下内容添加到切换按钮布局中:

android:saveEnabled="false"

这将确保android不会将检查状态存储到
RestoreInstance
,反过来也不会导致您经历的状态更改。

一旦CheckedChangeListener
在一个if条件下为我工作

if(buttonView.isShown())
{
    //ToDo code
}

在调用setCheck()函数之前,将侦听器设置为null,然后启用它,如下所示:

checkBox.setOnCheckedChangeListener (null);
checkBox.setChecked(true);
checkBox.setOnCheckedChangeListener (this);

参考资料:

我也遇到了同样的问题,并通过使用单击式侦听器找到了解决方法

首先检查复选框是否分配了onclicklistener。如果没有,则表示适配器正在设置第一个复选框的值

if(!holder.checkbox.hasOnClickListeners())
        {
            holder.checkbox.setChecked(data.get( position ).getSelected());

        }
现在检查完这个

holder.checkbox.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    data.get( position ).setSelected(holder.checkbox.isChecked());
                    holder.checkbox.setChecked(data.get( position ).getSelected());

                    Toast.makeText(getApplicationContext(),
                            data.get( position ).get_number()+" : "+position, Toast.LENGTH_LONG).show();
                }
            });

希望滚动问题消失。在这里效果很好。

strong文本有很多方法可以解决这个问题

checkBoxSelect.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
           // write here your code for example ...
              if(isChecked){
               // do somtheing when is checked
                   }else{
                       // do somthing when is removed the check**strong text**
                        }


        }
    });
**还有另一种方法**

    checkBoxSelect.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(((CheckBox)v).isChecked()){
//do something
            }else{
//do something
}
        });

在OnCheckedChange方法中添加一个额外的if语句
isShown()
,它解决了OnCheckedChangeListener被多次调用的问题。 无需更改为onClickListener:

@Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
   if (buttonView.isShown()) { 
        if (buttonView.isChecked()) { 
             //Do something 
        } else { 
             //Do something 
        } 
    } 
}

谢谢-改进!!!-不再调用侦听器。因此,arraylist不再增长。非常好!!!但现在的问题是,如果我选中5个复选框项,将它们从视图中滚动出来,并且只选中一个项。知道如何解决此问题吗?(使用min API 11)这是否有帮助?也许可以接受答案?:D“t似乎是多个组件的问题,尤其是使用checkedChange()方法(复选框,RadioButton)”感谢这些评论。就连我也面临同样的问题,并被onclicklistener取代。这是正确的答案,这个问题与setOnCheckedChangeListener有关,这个答案解决了实际问题的主题。非常感谢!isShown()在视图上确实是方便的功能。这是正确的答案…谢谢@Sonal Bausakar
@Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
   if (buttonView.isShown()) { 
        if (buttonView.isChecked()) { 
             //Do something 
        } else { 
             //Do something 
        } 
    } 
}