我不能用getGroupView-method解决问题。
问题是监听器setOnCheckedChangeListener被调用了很多次。
假设我选中了某个复选框项。然后,我将其滚动出视图,然后再向后滚动。发生的情况是监听程序再次被调用。问题是我将checkbox-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;
}
发布于 2013-06-29 04:15:23
您使用的是什么版本的Android?
这似乎是多个组件的问题,特别是对于checkedChange()方法(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
}
});
发布于 2016-02-17 04:53:26
OnCheckedChangeListener
为我工作,但有一个if条件
if(buttonView.isShown())
{
//ToDo code
}
发布于 2018-01-24 03:12:03
在OnCheckedChange方法中添加一个额外的if语句isShown()
,它解决了OnCheckedChangeListener被多次调用的问题。不需要更改为onClickListener:
@Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (buttonView.isShown()) {
if (buttonView.isChecked()) {
//Do something
} else {
//Do something
}
}
}
https://stackoverflow.com/questions/17372750
复制相似问题