Я только что нашел обходной путь, чтобы система не отображала это неправильное поведение.
Существует два сценария, в которых для работы SectionIndexer
используется другой код.
Первый сценарий - это случай, когда вы используете FastScrollbar-Thumb для перехода к следующему разделу. Если предположить, что группы являются вашими разделами, переопределенные методы для реализации SectionIndexer
будут выглядеть так:
@Override
public int getPositionForSection(int section) {
return section;
}
// Gets called when scrolling the list manually
@Override
public int getSectionForPosition(int position) {
return ExpandableListView.getPackedPositionGroup(
expandableListView
.getExpandableListPosition(position));
}
Второй сценарий - это случай, когда вы прокручиваете список вручную, а полосы быстрой прокрутки перемещаются в соответствии с разделами, а не со всеми элементами. Код выглядит так:
@Override
public int getPositionForSection(int section) {
return expandableListView.getFlatListPosition(
ExpandableListView.getPackedPositionForGroup(section));
}
// Gets called when scrolling the list manually
@Override
public int getSectionForPosition(int position) {
return ExpandableListView.getPackedPositionGroup(
expandableListView
.getExpandableListPosition(position));
}
Как видно, эти два поведения не могут играть вместе без дальнейшего усыновления.
Обходное решение, позволяющее сделать так, чтобы оно работало, состоит в том, чтобы поймать случай, когда кто-то прокручивает за руку (то есть, прокручивает касанием). Это можно сделать с помощью реализации интерфейса OnScrollListener
с классом адаптера и установки его на ExpandableListView
:
public class MyExpandableListAdapter extends BaseExpandableListAdapter
implements SectionIndexer, AbsListView.OnScrollListener {
// Your fields here
// ...
private final ExpandableListView expandableListView;
private boolean manualScroll;
public MyExpandableListAdapter(ExpandableListView expandableListView
/* Your other arguments */) {
this.expandableListView = expandableListView;
this.expandableListView.setOnScrollListener(this);
// Other initializations
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
this.manualScroll = scrollState == SCROLL_STATE_TOUCH_SCROLL;
}
@Override
public void onScroll(AbsListView view,
int firstVisibleItem,
int visibleItemCount,
int totalItemCount) {}
@Override
public int getPositionForSection(int section) {
if (manualScroll) {
return section;
} else {
return expandableListView.getFlatListPosition(
ExpandableListView.getPackedPositionForGroup(section));
}
}
// Gets called when scrolling the list manually
@Override
public int getSectionForPosition(int position) {
return ExpandableListView.getPackedPositionGroup(
expandableListView
.getExpandableListPosition(position));
}
// Your other methods
// ...
}
Это исправило ошибку для меня.