Intereting Posts
Уклонение от приема сообщений Google облачных сообщений не запускается (трансляция выполнения callback: result = CANCELED forIntent) Не получать смс, даже если установить самый высокий приоритет и установить первый Захват нажатия клавиш, когда телефон Android работает в глубоком спящем режиме Панорамная карта google в CoordinatorLayout заставляет recyclerview прокручиваться в библиотеке поддержки дизайна Android 23.0.1 Camera.Parameters.FLASH_MODE_TORCH для Android 2.1 Неправильные временные метки представления при обратном просмотре через видео MP4 OpenID для приложений для Android, для которых требуется SignIn Загрузка изображений в tumblr API с Android Ошибка импорта проекта Maven Android Android в Eclipse с ADT 20 Ионная Android-сборка перестала работать Ошибка MSB4185: «System.Globalization.CultureInfo» не была включена для выполнения Интеграция Google кошелька в приложение для Android Кинжал 2.10 / 2.11 инъекции Имитировать Android SMS / Call на устройстве USB Список ключевых слов «noinspection» в Android Studio

Повторно проиндексировать / обновить разделIndexer

Есть ли способ переиндексировать SectionIndexer после добавления новых элементов в ListView?

Я нашел это решение , но оверлей – это положение в верхнем левом углу после обновления разделаInIndexer.

У кого-нибудь есть идеи?

Solutions Collecting From Web of "Повторно проиндексировать / обновить разделIndexer"

После того, как FastScroller (его в классе AbsListView , из которого AbsListView ListView ) получает ваши разделы, вызывая SectionIndexer#getSections() , он никогда не получает их повторно, если вы не включили / отключили быструю прокрутку, как упомянуто в упомянутой ссылке. Чтобы получить значение, отображаемое на экране, FastScroller вызывает метод toString раздела.

Одно из возможных решений заключается в том, чтобы иметь пользовательский SectionIndexer который имеет следующие характеристики:

  • Массив разделов имеет фиксированную длину (максимальная длина ожидаемого числа разделов. Например, если разделы представляют английский алфавит, это будет 26)
  • Имейте пользовательский объект для представления разделов, а не используя строки
  • Перезапишите метод toString вашего пользовательского раздела, чтобы отобразить то, что вы хотите, на основе текущих значений раздела.

Например, в вашем пользовательском SectionIndexer

 private int mLastPosition; public int getPositionForSection(int sectionIndex) { if (sectionIndex < 0) sectionIndex = 0; // myCurrentSectionLength is the number of sections you want to have after // re-indexing the items in your ListView // NOTE: myCurrentSectionLength must be less than getSections().length if (sectionIndex >= myCurrentSectionLength) sectionIndex = myCurrentSectionLength - 1; int position = 0; // --- your logic to find the position goes in here // --- eg see the AlphabeticIndexer source in Android repo for an example mLastPosition = position; return mLastPosition; } public Object[] getSections() { // Assume you only have at most 3 section for this example return new MySection[]{new MySection(), new MySection(), new MySection()}; } // inner class within your CustomSectionIndexer public class MySection { MySection() {} public String toString() { // Get the value to displayed based on mLastPosition and the list item within that position return "some value"; } } 

Я нашел, что лучший способ сделать это – вызвать setContentView(R.layout.whatever) а затем повторно заполнить ListView новыми ListView нового адаптера / нового элемента. Это приведет к перерисовке ListView с новыми элементами, а наложение FastScroll будет отображаться в нужном месте.

Я нашел notifyDataSetInvalidated работающий отлично, вот идея:

 public class MyAdapter extends XXXAdapter implements SectionIndexer { ... public void updateDataAndIndex(List data, Map index) { // update sections // update date set notifyDataSetInvalidated(); } } 

Обновите свой набор данных и индекс (разделы) каким-то образом, а затем notifyDataSetInvalidated , индекс notifyDataSetInvalidated .

Вы можете принудительно перезагрузить список разделов ListView с помощью listView.setAdapter(yourAdapter)