在我的项目中,我有扩展ArrayAdapter<String>并实现SectionIndexer的类。当实现方法getPositionForSectiongetSectionForPosition时,我发现了一些奇怪的行为。

为什么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);
}

10-05 23:23