Есть ли способ переиндексировать SectionIndexer после добавления новых элементов в ListView?
Я нашел это решение, но наложение - это положение в верхнем левом углу после обновления раздела.
У кого-нибудь есть идеи?
Есть ли способ переиндексировать SectionIndexer после добавления новых элементов в ListView?
Я нашел это решение, но наложение - это положение в верхнем левом углу после обновления раздела.
У кого-нибудь есть идеи?
Как только класс FastScroller
(его класс AbsListView
, который ListView
продолжается) получает ваши разделы, вызывая SectionIndexer#getSections()
, он никогда не получает их повторно, если вы не включили/отключили быструю прокрутку, как упомянуто в ссылке ты упомянул. Чтобы получить значение, отображаемое на экране, FastScroller вызывает раздел toString.
Одним из возможных решений является создание пользовательского SectionIndexer
, который имеет следующие характеристики:
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";
}
}
Я обнаружил, что лучший способ сделать это - вызвать setContentView(R.layout.whatever)
, а затем повторно заполнить 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
, индекс обновится.
Вы можете принудительно перегрузить список разделов в ListView на listView.setAdapter(yourAdapter)