使用this Expandable List checkbox example code作为基线,我正在尝试保存并维护复选框状态。但是,正在检查并取消选中随机复选框(使用新值触发我的OnCheckedChangeListener
),当我将它们滚出视线,最小化其组,甚至最小化/最大化附近的组时!
public Object getChild(int groupPosition, int childPosition) {
return colors.get( groupPosition ).get( childPosition );
}
public long getChildId(int groupPosition, int childPosition) {
return (long)( groupPosition*1024+childPosition ); // Max 1024 children per group
}
public View getChildView(final int groupPosition, final int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
View v = null;
if( convertView != null ) {
v = convertView;
} else {
v = inflater.inflate(R.layout.child_row, parent, false);
}
Color c = (Color)getChild( groupPosition, childPosition );
TextView color = (TextView)v.findViewById( R.id.childname );
if( color != null ) {
color.setText( c.getColor() );
}
TextView rgb = (TextView)v.findViewById( R.id.rgb );
if( rgb != null ) {
rgb.setText( c.getRgb() );
}
CheckBox cb = (CheckBox)v.findViewById( R.id.check1 );
cb.setChecked( c.getState() );
cb.setOnCheckedChangeListener(new OnCheckedChangeListener()
{
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
{
colors.get(groupPosition).get(childPosition).setState(isChecked);
context.setColorBool(groupPosition, childPosition, isChecked);
Log.d("ElistCBox2", "listitem position: " +groupPosition+"/"+childPosition+" "+isChecked);
}
});
return v;
}
我不知道哪条代码可以对此负责,因此欢迎任何有关此处包含的内容的建议。我的代码只是在尝试保存值时与原始代码不同。
答案 0 :(得分:0)
我的猜测是,当您的适配器正在创建视图时,正在初始化复选框视图时调用检查侦听器。 android中的很多小部件都是这样工作的......初始化视图时会调用监听器。
我不知道为什么事情会这样,但它可能是允许客户端代码以一致的方式初始化自己。例如,用户是否选中了复选框,或者是否将其初始化为已选中,请运行相同的代码。
要抵消这一点,你可以尝试做一些事情,比如在你的监听器类impl中设置一个标志,让你忽略第一次点击,比如,
cb.setOnCheckedChangeListener(new OnCheckedChangeListener()
{
private void first = true;
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
{
if (first) {
first = false;
return;
}
colors.get(groupPosition).get(childPosition).setState(isChecked);
context.setColorBool(groupPosition, childPosition, isChecked);
Log.d("ElistCBox2", "listitem position: " +groupPosition+"/"+childPosition+" "+isChecked);
}
});
另外,请确保您在适配器中convertView
的实现中正确使用getView()
。如,
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
if (view == null) {
view = inflater.inflate(R.layout.applications_item, null);
}
答案 1 :(得分:0)
这是一个非常古老的问题,但我遇到了同样的问题,所以这是我对任何人的回答:
最简单的方法是使用CheckBox.onClickListener而不是onCheckedChangeListener。
这在重新排列逻辑方面只是有点烦人,但是会确保当随机取消选中这些框时(通过例如扩展相邻的组),事件将不会触发。
老实说,我认为这应该被视为一个错误,即使我确定可以从Android源解释这种行为。