Android fastScroll охватывает только часть списка

У меня есть класс, который реализует expandable list activity .
В XML-коде (или я могу сделать это в java), я установил fastScrollEnabled в true . Это позволяет сделать быстрый прокрутку. НО быстрый свиток работает только в верхней части списка. Например, я могу использовать панель быстрого доступа fastscroll для прокрутки всего списка, но работает только в верхней части полосы прокрутки. Это не пропорционально всему списку. Я могу перетащить панель большого пальца в нижнюю часть списка, но она не прокручивается, поскольку listview уже прокручивается снизу из-за нечетного поведения, которое оно работает только в верхней части списка.
Смущаю, я знаю, я могу попытаться уточнить, если потребуется …

Я реализую пользовательский BaseExpandableListAdapter.

Solutions Collecting From Web of "Android fastScroll охватывает только часть списка"

Я только что нашел обходное решение, чтобы система не отображала это неправильное поведение.

Существует два сценария, в которых для работы 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 интерфейса 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 .

Смотрите мой код .

(В некоторых случаях это также касается работы)