1

ArrayAdapter实现内部SectionIndexer有代码检查以相同的第一个字母开头的列表项 - 因此可以合并它。

像这样:

    alphaIndexer = new HashMap<String, Integer>();
    int size = objects.length; 

    for (int i = 0; i < size; i++) {

        // Log.d("ObjectLength", String.valueOf(objects.length));

        ItemObject it = objects[i];
        String name = it.name;
        String s = name.substring(0, 1);
        s = s.toUpperCase();

        if (!alphaIndexer.containsKey(s)) {
            alphaIndexer.put(s, i);
        }
    }

    Set<String> sectionLetters = alphaIndexer.keySet();
    ArrayList<String> sectionList = new ArrayList<String>(sectionLetters);
    Collections.sort(sectionList);
    sections = new String[sectionList.size()];

    // sectionList.toArray(sections);

    for (int i = 0; i < sectionList.size(); i++)
        sections[i] = sectionList.get(i);

我的问题是,合并这种方式会影响 FastScrolling 吗?有时在使用 的 ListViews 上SectionIndexer,Fast Scroll 并不总是流畅,而是“断断续续”。我可以SectionIndexer从情况中删除,快速滚动突然平滑且按比例滚动。

添加代码:

public int getPositionForSection(int section) {
    return alphaIndexer.get(sections[section]);
}

public int getSectionForPosition(int position) {
    return 0;
}

public Object[] getSections() {
        return sections;
    }
4

1 回答 1

5

SectionIndexer 确实会影响快速滚动。

使用 SectionIndexer 时,您的意思是希望用户能够精确地跳转到数据集的这些部分。如果这些部分中的数据分布不均匀,则快速滚动条将与其在这组部分中的进度成比例地移动,而不是与其在数据集中每个单独项目中的进度成比例地移动。

这是故意的;这样做是为了当用户拖动快速滚动拇指时,每个部分都被赋予相同的权重。精确定位任何部分就像定位任何其他部分一样容易,即使一个部分只有一个项目,而它两侧的部分有数百个。

于 2012-08-26T18:08:49.187 回答