在我的项目中,我有扩展ArrayAdapter<String>
并实现SectionIndexer
的类。当实现方法getPositionForSection
和getSectionForPosition
时,我发现了一些奇怪的行为。
为什么getSectionForPosition
返回0时节索引器正常工作?
public int getSectionForPosition(int position) {
return 0;
}
许多教程都使用此实现,例如:
http://androidopentutorials.com/android-listview-fastscroll/
http://www.survivingwithandroid.com/2012/12/android-listview-sectionindexer-fastscroll.html
文档说
给定适配器中的位置,则返回适配器的索引
部分对象数组中的相应部分。
因此,如果我的列表中有5个以字母“ A”开头的项目,而有些项目以字母“ B”开头,则getSectionForPosition(5)应该返回1。
最佳答案
虽然sectionIndexer
的基本功能(拉动滚动条拇指时滚动浏览部分索引)不受影响,但是在方法getSectionForPosition
中返回常量可能导致滚动列表时滚动条的位置出现异常(例如,滚动条在y轴上移出窗口)。
显然,这种不当行为仅在列表或单个节超过一定长度时才会发生,因此对于较短的列表,索引器似乎可以正常工作(但实际上不行)。在上述方法中多次返回常量并通过以正确的方式实现getSectionForPosition
修复它时,我在较大的列表中遇到了这种错误行为。
但是,由于对其他人可能很有趣,因此我可以提供该方法的示例实现。假设azIndexer
是包含正确索引的HashMap
映射的section -> position
,而listItems
是适配器排列的项。以下内容构建了一个存储在position -> sectionIndex
中的positionIndexer
映射。
List<Integer> values = new ArrayList();
for (int i : azIndexer.values()) {
values.add(i);
}
values.add(listItems.size()-1);
Collections.sort(values);
int k = 0;
int z = 0;
for(int i = 0; i < values.size()-1; i++) {
int temp = values.get(i+1);
do {
positionIndexer.put(k, z);
k++;
} while(k < temp);
z++;
}
然后将在
getSectionForPosition
方法中使用它:@Override
public int getSectionForPosition(int position) {
return positionIndexer.get(position);
}