带有复选框问题的Android列表视图
Posted
技术标签:
【中文标题】带有复选框问题的Android列表视图【英文标题】:Android listview with checkbox problem 【发布时间】: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,但没想到解决方案这么简单 【参考方案1】:这很棘手。
问题是你正在调用setChecked
,激活旧的OnCheckedChangeListener
。
解决方法很简单:在调用setChecked
之前调用setOnCheckedChangeListener
。这样你就可以从回收的视图中切断到旧监听器的链接。
【讨论】:
你让我大吃一惊!那确实解决了它!我不可能看到那个!谢谢! 是的,我没有意识到setChecked
会触发OnCheckedChangeListener
。吸取教训!
如果您愿意,也可以看看 Vikas 的回答!它工作得很好!就“逻辑”或“事件流”而言,它实际上更容易!
我想了一会儿,但一开始并没有尝试自己,并且不必要地浪费了几个小时,直到我在这里读到它确实有效!所以点赞
请发布您的示例代码,对不起,我不知道如何解决这个问题【参考方案2】:
选中此项以在Listview
中选择Checkbox
AdpList adapter=new AdpList(this,array,false);
listview.setAdapter(adapter);
当您选择任何项目时,然后在项目CLickListener
上执行以下操作
listview.setonItemClickListener(new OnItemClickListener)
在这里你会得到当前项目的位置
array.get(Position);
获取复选框视图并单击复选框,在适配器中创建一个方法,例如
adapter.setList(true);
adapter.notifyDataSetChanged();
然后在适配器中检查我在Setlist
方法中传递的参数
然后输入条件:
if (isChecking==true)
checkbox1.setChecked(true);
else
checkBox1.setChecked(false);
【讨论】:
以上是关于带有复选框问题的Android列表视图的主要内容,如果未能解决你的问题,请参考以下文章
Android:如何在列表视图中自动显示带有复选框的 Sqlite 数据库
如何使用复选框将Android联系人添加到列表视图中[重复]