我有一个奇怪的问题!我正在尝试创建一个带有复选框的列表视图。在我的另一个thread https://stackoverflow.com/questions/5438375/custom-listview-with-checkbox-problem有人告诉我应该使用一个数组来跟踪检查的行。我这样做了,效果很好,但逻辑是错误的,我现在遇到了另一个问题。
public View getView(final int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.row, null);
}
CheckBox checkbox = (CheckBox)v.findViewById(R.id.checkbox);
checkbox.setChecked(checked[position]);
final LinearLayout rowLayout = (LinearLayout) v.findViewById(R.id.individualRow);
checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener(){
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(isChecked)
{
rowLayout.setBackgroundColor(Color.GRAY);
checked[position] = false;
}
else
{
rowLayout.setBackgroundColor(Color.DKGRAY);
checked[position] = true;
}
}
});
}
最初未选中所有复选框,它工作正常,即使我向下滚动并再次向上滚动,但选中的数组未正确设置,它仍会保持我选择的复选框处于选中状态。基本上 if 测试应该是相反的!
if(isChecked)
{
rowLayout.setBackgroundColor(Color.GRAY);
checked[position] = true;
}
else
{
rowLayout.setBackgroundColor(Color.DKGRAY);
checked[position] = false;
}
问题确实出在滚动上,因为每次我滚动时都会调用 onCheckedChanged 方法,并且由于它回收了行,所以它在未选择的新行的位置传递,但因为它具有与先前选择的索引相同的索引它改变了它的价值。例如,如果我选中索引为 2 的框(将其设置为 true),然后向下滚动新行成为索引为 2 的行,则再次调用该方法并取消设置复选框(选中数组中的字段)。
我需要它来“记住”所有选中的框。换句话说,我希望检查的数组能够正确初始化。并且还要记住选中了哪些框,并且每次滚动时都不会丢失它们!
我究竟做错了什么?
你能帮我么?
提前致谢——迈克
这很棘手。
问题是你正在打电话setChecked
,激活旧的OnCheckedChangeListener
.
修复方法非常简单:调用setOnCheckedChangeListener
打电话之前setChecked
。这样,您就可以从回收的视图中切断到旧侦听器的链接。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)