Ответ 1
Как только класс FastScroller
(его класс 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
// --- e.g. 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";
}
}