1

私のプロジェクトには、拡張ArrayAdapter<String>および実装するクラスがありますSectionIndexergetPositionForSectionメソッドを実装すると、getSectionForPositionいくつかの奇妙な動作が見つかりました。

getSectionForPosition0 を返すときにセクション インデクサーが正しく動作するのはなぜですか?

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

この実装は、次のような多くのチュートリアルで使用されています。

http://androidopentutorials.com/android-listview-fastscroll/

http://www.survivingwithandroid.com/2012/12/android-listview-sectionindexer-fastscroll.html

ドキュメンテーションはそれを言う

アダプター内の位置を指定すると、セクション オブジェクトの配列内の対応するセクションのインデックスが返されます。

したがって、私のリストに文字「A」で始まる 5 つの項目と文字「B」で始まるいくつかの項目がある場合、getSectionForPosition(5) は 1 を返す必要があります。

4

2 に答える 2

3

の基本機能sectionIndexer(スクロールバーのつまみを引いたときにセクション インデックスをスクロールする) は影響を受けませんが、メソッドで定数を返すとgetSectionForPosition、リストをスワイプするときにスクロールバーの位置が正しく動作しなくなる可能性があります (たとえば、スクロールバーがウィンドウの外に移動する)。 y 軸上)。

どうやらこの誤動作は、リストまたは単一のセクションが特定の長さを超えた場合にのみ発生するため、短いリストの場合、インデクサーは正しく機能しているように見えるかもしれません (実際にはそうではありません)。上記のメソッドで定数を返すときに、大きなリストでこの誤動作を数回経験getSectionForPositionし、正しい方法で実装することで修正しました。


ただし、他の人にとっては興味深いかもしれないので、そのメソッドのサンプル実装を提供できます。私azIndexerのインデックスHashMapの正しいマッピングを含むとし、アダプターによって配置された項目にします。以下は、 に格納されたマッピングを構築します。section -> positionlistItemsposition -> sectionIndexpositionIndexer

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);
}
于 2015-03-28T15:25:11.777 に答える