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

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

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

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

Ответы

Ответ 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";
    }
}

Ответ 2

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

Ответ 3

Я нашел, что notifyDataSetInvalidated работает нормально, вот идея:

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

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

Ответ 4

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