AlphabetIndexer setCursor не обновляет свой кеш - PullRequest
5 голосов
/ 15 июля 2011

Я пытаюсь реализовать быстрый скроллер с AlphabetIndexer, но когда курсор меняется, он не обновляет индексную чашу. В моем конструкторе CursorAdapter я вызываю setCursor(cursor), но ничего не меняется, и в соответствии с документацией:

Ваш адаптер отвечает за обновление курсора путем вызова setCursor (Cursor), если курсор изменяется. getPositionForSection (целое) метод выполняет двоичный поиск начального индекса заданного раздел (алфавит).

Но ничего не происходит. Я использую это для поискового фильтра, поэтому, когда я ищу контакты, он обновляет список с контактами, поэтому AlphabetIndexer должен работать для обновления индекса новых элементов в списке.

Пример. Весь мой список начинается с контактов, которые начинаются с буквы «А» и заканчиваются контактами, начинающимися с буквы «Е». Таким образом, AlphabetIndexer будет иметь эти индексы в своем кэше.

Но, давайте попробуем поискать контакты с «C», и скажем, у меня 250 контактов, которые начинаются с «C». Итак, мне нужно быстро прокрутить эти контакты, и должен отображаться индекс 'C', но вместо только 'C' он показывает все индексы, которые были показаны, когда у меня был весь список.

Вот мой конструктор CursorAdapter, где я вызываю setCursor (курсор) для каждой вводимой буквы:

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

Ответы [ 2 ]

3 голосов
/ 17 июля 2011

Я решил это путем последовательного вызова после установки адаптера:

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

Это сработало для меня.

0 голосов
/ 02 мая 2014

вызовите setContentView(R.layout.whatever), а затем заново заполните ListView новым адаптером / новыми элементами данных.Это перерисовает ListView с вашими новыми элементами, и оверлей FastScroll появится в правильном месте.

...