5

AlphabetIndexer を使用して高速スクローラーを実装しようとしていますが、カーソルが変更されると、インデックス キャッシュが更新されません。私の CursorAdapter コンストラクターでは、呼び出しますsetCursor(cursor)が、何も変更されず、ドキュメントによると:

カーソルが変更された場合、アダプタは setCursor(Cursor) を呼び出してカーソルを更新する責任があります。getPositionForSection(int) メソッドは、指定されたセクション (アルファベット) の開始インデックスのバイナリ検索を実行します。

しかし、何も起こっていません。これを検索フィルターに使用しているので、連絡先を検索すると、リストが連絡先で更新されるため、AlphabetIndexer はリスト内の新しいアイテムのインデックスを更新するために機能するはずです。

例: 私のリスト全体は、「A」で始まる連絡先で始まり、「E」で始まる連絡先で終わります。したがって、AlphabetIndexer はこのインデックスをキャッシュに保持します。

しかし、'C' で始まる連絡先を検索してみましょう。'C' で始まる連絡先が 250 件あるとします。したがって、この連絡先をすばやくスクロールする必要があり、'C' インデックスが表示される必要がありますが、'C' だけではなく、リスト全体を取得したときに表示されたすべてのインデックスが表示されます。

入力する文字ごとに setCursor(cursor) を呼び出す CursorAdapter コンストラクターを次に示します。

public MyCursorAdapter(Context context, Cursor cursor, ArrayList<Integer> ids) 
        {
            super(context, cursor);
            try
            {
                mAlphaIndexer = new AlphabetIndexer(cursor, cursor.getColumnIndexOrThrow("Name")," ABCDEFGHIJKLMNOPQRSTUVWXYZ");
                notifyDataSetChanged(); 
                mAlphaIndexer.setCursor(cursor);        
                this.mSelectedContacts = ids;               
                Log.e("MyCursorAdapter", "construtor: ");
            }
            catch(Exception ex)
            {
                Log.e("MyCursorAdapter", "Error: " + ex);
            }
            finally
            {
                mAlphaIndexer.setCursor(cursor);
            }
        }
4

2 に答える 2

3

アダプターを設定した後、これを順番に呼び出すことでこれを解決しました。

listView.setFastScrollEnabled(false);
listView.setFastScrollEnabled(true);

それは私のために働いた。

于 2011-07-17T04:13:39.337 に答える
0

を呼び出しsetContentView(R.layout.whatever)てから、新しいアダプター/新しいデータ項目で ListView を再設定します。これにより、新しいアイテムで ListView が再描画され、FastScroll Overlay が正しい場所に表示されます。

于 2014-05-02T15:36:49.230 に答える