我想在单击按钮时从自定义列表视图中选择所有 CheckBox 。
但是当我在ListView中有超过9个项目时,我在第二行代码中得到NullPointerException。
View vi= diffeneceLv.getChildAt(i);
CheckBox cb = (CheckBox) vi.findViewById(R.id.conschkbx);
答案 0 :(得分:3)
你弄错了,ListView
重新使用你的行,这意味着内存中创建的行/布局数量不等于数组中的项目。
通常ListView
会在滚动时将新数据重新设置为上一行。
我建议你学习this blog post,这里作者正在维护Checked状态,然后在适配器的getView()
中相应地设置它。
作者创建了一个像这样的bolean数组:
private boolean[] thumbnailsselection;
并存储检查或取消选中的状态,稍后从getView()
访问它,您将执行的操作是,您将为所有索引存储true
并刷新适配器。它会选择你所有的行。
这是another post。
答案 1 :(得分:0)
您不应为此目的持有个别观点的参考资料,因为它们会被回收。
为方便起见,ListView
持有BooleanSparseArray
来存储检查的项目。此数组包含项ID(适配器中的项的索引/位置)到布尔值的映射。
由于ListView
会为您完成所有这些工作,因此避免重新发明轮子,并使用ListView
的功能来保持其项目的已检查状态。您所要做的就是为ListView
设置一个选择模式:setChoiceMode(int choiceMode)
要获取任何项目的状态,请在ListView
上致电isItemChecked(int position)
。如果您覆盖适配器getView()
,则很有用。
要完成所有检查,请在ListView
上致电getCheckedItemPositions()
。
要设置选中的值,请在ListView
上致电setItemChecked(int position, boolean value)
。