2013-09-01 50 views
2

我遇到了由合并游标填充的listview问题。 我在我的应用程序中有一个按钮来选择我的列表视图中的所有条目。按下按钮时调用的函数如下:listview setItemChecked无法正常工作

private void selectAllEntries() { 
    int numberOfItemsInList = listView.getCount(); 
    for (int i = 0; i < numberOfItemsInList; i++) { 
     this.listView.setItemChecked(i, true); 
    } 
} 

问题是,并非所有条目最后都会被检查。确实很奇怪。经过一些测试后,我注意到如果我在mergecursor中有10个条目(5个来自游标a,5个来自游标b),那么如果我只在前5个元素上使用setItemChecked,那么一切正常(这5个条目会被检查)。如果我在最后5个元素上再次使用setItemchecked,一切正常(光标b的条目被检查),但是如果我对两个游标的元素使用setItemChecked,那么获取检查的元素的最大数量是光标a中元素的数量(在我们的例子中为5),偏移量为(我想设置的项目数 - 光标a中的项目数)。我会写下几个例子,因为这是一个非常奇怪的行为。

Example 1: 
element 0 (from cursor a, unchecked) 
element 1 (from cursor a, unchecked) 
element 2 (from cursor a, unchecked) 
element 3 (from cursor a, unchecked) 
element 4 (from cursor a, unchecked) 
element 5 (from cursor b, unchecked) 
element 6 (from cursor b, unchecked) 
element 7 (from cursor b, unchecked) 
element 8 (from cursor b, unchecked) 
element 9 (from cursor b, unchecked) 

setItemChecked(0,true); 
setItemChecked(1,true); 
setItemChecked(2,true); 
setItemChecked(3,true); 
setItemChecked(4,true); 

Results: 

element 0 (from cursor a, checked) 
element 1 (from cursor a, checked) 
element 2 (from cursor a, checked) 
element 3 (from cursor a, checked) 
element 4 (from cursor a, checked) 
element 5 (from cursor b, unchecked) 
element 6 (from cursor b, unchecked) 
element 7 (from cursor b, unchecked) 
element 8 (from cursor b, unchecked) 
element 9 (from cursor b, unchecked) 

Example 2: 
element 0 (from cursor a, unchecked) 
element 1 (from cursor a, unchecked) 
element 2 (from cursor a, unchecked) 
element 3 (from cursor a, unchecked) 
element 4 (from cursor a, unchecked) 
element 5 (from cursor b, unchecked) 
element 6 (from cursor b, unchecked) 
element 7 (from cursor b, unchecked) 
element 8 (from cursor b, unchecked) 
element 9 (from cursor b, unchecked) 

setItemChecked(5,true); 
setItemChecked(6,true); 
setItemChecked(7,true); 
setItemChecked(8,true); 
setItemChecked(9,true); 

results: 

element 0 (from cursor a, unchecked) 
element 1 (from cursor a, unchecked) 
element 2 (from cursor a, unchecked) 
element 3 (from cursor a, unchecked) 
element 4 (from cursor a, unchecked) 
element 5 (from cursor b, checked) 
element 6 (from cursor b, checked) 
element 7 (from cursor b, checked) 
element 8 (from cursor b, checked) 
element 9 (from cursor b, checked) 

Example 3: 
element 0 (from cursor a, unchecked) 
element 1 (from cursor a, unchecked) 
element 2 (from cursor a, unchecked) 
element 3 (from cursor a, unchecked) 
element 4 (from cursor a, unchecked) 
element 5 (from cursor b, unchecked) 
element 6 (from cursor b, unchecked) 
element 7 (from cursor b, unchecked) 
element 8 (from cursor b, unchecked) 
element 9 (from cursor b, unchecked) 

setItemChecked(0,true); 
setItemChecked(1,true); 
setItemChecked(2,true); 
setItemChecked(3,true); 
setItemChecked(4,true); 
setItemChecked(5,true); 

results in 

element 0 (from cursor a, unchecked) 
element 1 (from cursor a, checked) 
element 2 (from cursor a, checked) 
element 3 (from cursor a, checked) 
element 4 (from cursor a, checked) 
element 5 (from cursor b, checked) 
element 6 (from cursor b, unchecked) 
element 7 (from cursor b, unchecked) 
element 8 (from cursor b, unchecked) 
element 9 (from cursor b, unchecked) 


Example 4: 
element 0 (from cursor a, unchecked) 
element 1 (from cursor a, unchecked) 
element 2 (from cursor a, unchecked) 
element 3 (from cursor a, unchecked) 
element 4 (from cursor a, unchecked) 
element 5 (from cursor b, unchecked) 
element 6 (from cursor b, unchecked) 
element 7 (from cursor b, unchecked) 
element 8 (from cursor b, unchecked) 
element 9 (from cursor b, unchecked) 

setItemChecked(0,true); 
setItemChecked(1,true); 
setItemChecked(2,true); 
setItemChecked(3,true); 
setItemChecked(4,true); 
setItemChecked(5,true); 
setItemChecked(6,true); 

results: 

element 0 (from cursor a, unchecked) 
element 1 (from cursor a, unchecked) 
element 2 (from cursor a, checked) 
element 3 (from cursor a, checked) 
element 4 (from cursor a, checked) 
element 5 (from cursor b, checked) 
element 6 (from cursor b, checked) 
element 7 (from cursor b, unchecked) 
element 8 (from cursor b, unchecked) 
element 9 (from cursor b, unchecked) 


Example 5: 
element 0 (from cursor a, unchecked) 
element 1 (from cursor a, unchecked) 
element 2 (from cursor a, unchecked) 
element 3 (from cursor a, unchecked) 
element 4 (from cursor a, unchecked) 
element 5 (from cursor b, unchecked) 
element 6 (from cursor b, unchecked) 
element 7 (from cursor b, unchecked) 
element 8 (from cursor b, unchecked) 
element 9 (from cursor b, unchecked) 

setItemChecked(0,true); 
setItemChecked(1,true); 
setItemChecked(2,true); 
setItemChecked(3,true); 
setItemChecked(4,true); 
setItemChecked(5,true); 
setItemChecked(6,true); 
setItemChecked(7,true); 

results: 

element 0 (from cursor a, unchecked) 
element 1 (from cursor a, unchecked) 
element 2 (from cursor a, unchecked) 
element 3 (from cursor a, checked) 
element 4 (from cursor a, checked) 
element 5 (from cursor b, checked) 
element 6 (from cursor b, checked) 
element 7 (from cursor b, checked) 
element 8 (from cursor b, unchecked) 
element 9 (from cursor b, unchecked) 

我现在用的是

 listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); 

notifyDataSetChanged() 

也没有帮助。 有什么帮助吗?

作为一个侧面说明,

listView.getCount(); 

总是返回视图

+1

CursorAdapter使用数据库中的_id列来标识行,而AbsListView使用该值来跟踪哪些行被检查。这听起来像你的MergeCursor可能会返回重复的ID,例如,游标A中第一行的_id值与游标B中第一行的_id相同。是这种情况吗? – alanv

+0

就是这样,谢谢!看到我的评论如下 –

回答

3

为alanv说, 条目数正确“的CursorAdapter使用_id列从您的数据库,以确定行,并且AbsListView使用这个值来跟踪哪些行被检查,这听起来像你的MergeCursor可能会返回重复的ID,例如,游标A中第一行的_id值与游标B中第一行的_id相同。那个案子?“

就是这样。 改变光标后,以提供不同ID的所有工作好 但是:

  1. 合并光标是其他光标的串联,不应该合并光标能够用相同的ID从不同子来处理游标(例如通过在内部创建新的ID)。
  2. 查看合并游标的所有结果,并与它们进行交互(点击它们)工作正常,所以我希望检查它们以及它是否正常工作?