1

Androidリストビューで最初の文字のプレビューを表示する際に問題に直面しています。高速スクロールするとテキストのプレビューが表示されますが、リスト内の間違った場所を指しています。

たとえば、下の画像をご覧ください。この画像では、M セクションにいますが、まだ L 文字が表示されています。

ここに画像の説明を入力

上記の Technic を実装する Listadapter コードは次のとおりです。コードに誤りはありますか?

    class MyListAdaptor extends ArrayAdapter<String> implements
        SectionIndexer 
{

    HashMap<String, Integer> alphaIndexer;
    String[] sections;

    public MyListAdaptor(Context context, LinkedList<String> items) {
        super(context, R.layout.list_item, items);

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

        for (int x = 0; x < size; x++) {
            String s = items.get(x);

            // get the first letter of the store
            String ch = s.substring(0, 1);
            // convert to uppercase otherwise lowercase a -z will be sorted
            // after upper A-Z
            ch = ch.toUpperCase();

            // HashMap will prevent duplicates
            alphaIndexer.put(ch, x);
        }

        Set<String> sectionLetters = alphaIndexer.keySet();

        // create a list from the set to sort
        ArrayList<String> sectionList = new ArrayList<String>(
                sectionLetters);

        Collections.sort(sectionList);

        sections = new String[sectionList.size()];

        sectionList.toArray(sections);
    }

    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

4

重複を防ぐために使用alphaIndexer.put(ch, x);することで、要素chの最初の位置ではなく、最後の位置を保持します。これはput、指定されたキーを持つ最初の呼び出し以外の各呼び出しが古い値を更新するためです。このコードを試すと、一歩近づくことができます。

if( !alphaIndexer.containsKey(ch) )
    alphaIndexer.put(ch, x);
于 2012-05-18T19:29:12.637 に答える