SectionIndexer如何影响Android快速滚动?

SectionIndexer如何影响Android快速滚动?,android,listview,Android,Listview,在实现SectionIndexer的ArrayAdapter内部,有一段代码用于检查以相同首字母开头的列表项,以便对其进行合并 像这样: alphaIndexer = new HashMap<String, Integer>(); int size = objects.length; for (int i = 0; i < size; i++) { // Log.d("ObjectLength", String.valueOf(ob

在实现SectionIndexer的ArrayAdapter内部,有一段代码用于检查以相同首字母开头的列表项,以便对其进行合并

像这样:

    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);

SectionIndexer确实影响快速滚动

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


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

SectionIndexer确实会影响快速滚动

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


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

每次调用getSectionForPosition/getPositionForSection时,都会执行您发布的代码?@zapl我只是在顶部添加了这些方法,以便您可以看到我在做什么。每次调用getSectionForPosition/getSectionForPosition时都会执行您发布的代码getPositionForSection被调用?@zapl我刚刚在顶部添加了这些方法,以便您可以看到我在做什么。谢谢您的输入。还有一个问题需要澄清:当我说它是起伏的时候,我应该清楚地表明,快速滚动拇指滚动器符号在你定期滚动时与屏幕高度不成正比。有时它会跳到底部,有时它会从屏幕上滚下来。但是如果你手动抓取滚动条,它是成比例的。在我的应用程序中,我保持快速滚动,并删除了SectionIndexer,无论哪种方式,它都能完美滚动。我说的有意义吗?它离开屏幕是不正常的确保您提供了SectionIndexer接口的所有方法-它需要能够双向映射,从节索引到适配器位置,以及从适配器位置到该项的节索引。编辑刚刚看到你添加的代码;getSectionForPosition方法报告每个项都属于第一节。它应该报告位置所属部分的索引。如果您有[A,B,C]部分,并且位置X属于B部分,那么getSectionForPositionX应该返回1,因为索引1对应于B部分。如果X属于A部分,它将返回0,如果它属于C部分,它将返回2。正确,它不应返回常量:它的返回值将取决于作为参数传递的位置。您需要保持从位置到数据所属节的类似映射。这里即使是一个简单的int[]也可以,键作为位置,值作为相应的节索引。您可以在填充其余的节索引数据的同时填充它。感谢您的输入。还有一个问题需要澄清:当我说它是起伏的时候,我应该清楚地表明,快速滚动拇指滚动器符号在你定期滚动时与屏幕高度不成正比。有时它会跳到底部,有时它会从屏幕上滚下来。但是如果你手动抓取滚动条,它是成比例的。在我的应用程序中,我保持快速滚动,并删除了SectionIndexer,无论哪种方式,它都能完美滚动。我说的有意义吗?它离开屏幕是不正常的确保您提供了SectionIndexer接口的所有方法-它需要能够双向映射,从节索引到适配器位置,以及从适配器位置到该项的节索引。编辑刚刚看到你添加的代码;getSectionForPosition方法报告每个项都属于第一节。它应该报告位置所属部分的索引。如果您有[A,B,C]部分,并且位置X属于B部分,那么getSectionForPositionX应该返回1,因为索引1对应于B部分。如果X属于A部分,它将返回0,如果它属于C部分,它将返回2。正确,它不应返回常量:它的返回值将取决于作为参数传递的位置 n到数据所属的节。这里即使是一个简单的int[]也可以,键作为位置,值作为相应的节索引。您可以在填充其余的节索引数据的同时填充它。
public int getPositionForSection(int section) {
    return alphaIndexer.get(sections[section]);
}

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

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