Android FastScroll охватывает только часть списка - PullRequest
19 голосов
/ 16 декабря 2010

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

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

Ответы [ 2 ]

5 голосов
/ 24 июня 2013

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

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

Это исправило ошибку для меня.

1 голос
/ 29 апреля 2012

Это ошибка в быстром скроллере.Он не очень хорошо работает с ExpandableListView.

См. мой код .

(в некоторых случаях также есть обходной путь)

...