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