【发布时间】:2011-07-23 14:16:58
【问题描述】:
我有一个奇怪的问题!我正在尝试创建一个带有复选框的列表视图。在我的另一个thread 中,有人告诉我应该使用一个数组来跟踪检查的行。我这样做了,它工作得很好,但逻辑是错误的,我现在遇到了另一个问题。
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 的行,则再次调用该方法并取消设置复选框(选中数组中的字段)。
我需要它来“记住”所有选中的框。换句话说,我希望正确初始化检查的数组。还要记住选中了哪些框,并且每次滚动时都不会丢失它们!
我做错了什么?
你能帮帮我吗?
提前致谢 -- 迈克
【问题讨论】:
-
嘿mixkat 能详细说明一下数组的使用吗?
-
你能显示你填充布尔数组的位置吗???
-
遇到了同样的问题,但改用了 switch,但没想到解决方案这么简单
标签: android list listview checkbox