Ответ 1
Я только что нашел обходное решение, чтобы система не отображала это неправильное поведение.
Существует два сценария, в которых для работы 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));
}
Как видно, эти два поведения не могут играть вместе без дальнейшего принятия.
Обходной путь, чтобы заставить его работать, - это поймать случай, когда кто-то прокручивается за руку (т.е. прокручивается с помощью touch). Это можно сделать с помощью интерфейса 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
// ...
}
Это исправило ошибку.