Bjö*_*röm 30 checkbox android listener expandablelistview android-listview
我无法解决getGroupView方法的问题.
问题是监听器setOnCheckedChangeListener被多次调用.
假设我检查某个复选框项.然后我将其滚出视图,然后向后滚动.发生的事情是再次调用侦听器.问题是我将checkbox-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;
}
Run Code Online (Sandbox Code Playgroud)
Ale*_*xey 56
您使用的是哪个版本的Android?
这似乎是多个组件的问题,特别是使用checkedChange()方法(CheckBox,RadioButton),我无法提供一个很好的解释为什么会发生.
我会假设,因为它记录了位置状态的变化并抓住了其他属性的变化?这里解决了类似的问题
无论如何,围绕这个的解决方法可能是添加一个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
}
});
Run Code Online (Sandbox Code Playgroud)
小智 17
OnCheckedChangeListener 如果有条件,我会为我工作
if(buttonView.isShown())
{
//ToDo code
}
Run Code Online (Sandbox Code Playgroud)
小智 8
将以下内容添加到ToggleButton布局:
android:saveEnabled="false"
Run Code Online (Sandbox Code Playgroud)
这将确保android不存储检查状态RestoreInstance,反过来不会导致您经历的状态更改.
在调用setCheck()函数之前将侦听器设置为null,并在之后启用它,如下所示:
checkBox.setOnCheckedChangeListener (null);
checkBox.setChecked(true);
checkBox.setOnCheckedChangeListener (this);
Run Code Online (Sandbox Code Playgroud)
在OnCheckedChange方法中添加一条if语句isShown(),解决了OnCheckedChangeListener被多次调用的问题。无需更改为 onClickListener:
@Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (buttonView.isShown()) {
if (buttonView.isChecked()) {
//Do something
} else {
//Do something
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
70803 次 |
| 最近记录: |