Android FastScroll покрывает только часть списка
У меня есть класс, который реализует expandable list activity
,
В коде XML (или я могу сделать это в Java), я устанавливаю fastScrollEnabled
в true
, Это на самом деле включить быструю прокрутку. НО быстрая прокрутка работает только в верхней части списка. Например, я могу использовать полосу прокрутки fastscroll для прокрутки всего списка, но работает только в верхней части полосы прокрутки. Это не пропорционально всему списку. Я могу перетащить панель большого пальца в конец списка, но она не прокручивается, так как listview
уже прокручивается к нижней части из-за странного поведения, которое работает только в верхней части списка.
Путаю, я знаю, я могу попытаться уточнить больше, если это необходимо....
Я реализую кастом BaseExpandableListAdapter.
2 ответа
Я только что нашел способ избежать неправильного поведения системы.
Есть два сценария, которые используют разные коды для 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
// ...
}
Это исправило ошибку для меня.
Это ошибка в быстром скроллере. Это не очень хорошо с ExpandableListView
,
Смотри мой код.
(в некоторых случаях также есть обходной путь)