Android scrollview onScrollChanged

у меня есть фиксированный контент в моем текстовом представлении внутри вида прокрутки. Когда пользователь прокручивается в определенную позицию, я хотел бы начать действие или вызвать Toast.

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent" android:layout_height="fill_parent"
 android:id="@+id/scroller">
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical" android:layout_width="fill_parent"
  android:layout_height="fill_parent">
  <TextView android:layout_width="fill_parent" android:id="@+id/story"
   android:layout_height="wrap_content" android:text="@string/lorem"
   android:gravity="fill" />
 </LinearLayout>
</ScrollView>

моя проблема заключается в реализации защищенного метода onScrollChanged чтобы узнать положение вида прокрутки.

Я нашел этой ответ, есть ли более простое решение для этого, а не объявление интерфейса, над поездкой scrollview и т. д., Как видно по ссылке I отправлено?

10 ответов


нет.

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


существует гораздо более простой способ, чем подклассы ScrollView. The


этот вопрос довольно старый, но в случае, если кто-то падает (как у меня):

начиная с API-интерфейс 23, Android в View есть OnScrollChangeListener и соответствующий сеттер.

на NestedScrollView из библиотеки поддержки также поддерживает установку прослушивателя прокрутки даже до этого уровня API. Насколько мне известно, NestedScrollView смогите быть использовано как замена для нормального ScrollView без каких-либо проблем.


на самом деле есть способ узнать, как далеко прокрутил пользователь. Об этом говорит метод getScrollY() из ScrollView.


я расширил свой scrollView. этой ссылке может помочь.

class MyScroll extends ScrollView {
    boolean onTop=true;
    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        //Log.d(TAG, "scroll changed: " + this.getTop() + " "+t);
        if(t <= 0){
            onTop = true;
            //Log.d(TAG, "scroll top: " + t);
            super.onScrollChanged(l, t, oldl, oldt);
            return;
            // reaches the top end
        }
        onTop = false;

        View view = (View) getChildAt(getChildCount()-1);
        int diff = (view.getBottom()-(getHeight()+getScrollY()+view.getTop()));// Calculate the scrolldiff
        if( diff <= 0 ){
            // if diff is zero, then the bottom has been reached
        }
        super.onScrollChanged(l, t, oldl, oldt);
    }
}

NestedScrollView так же, как android.штучка.ScrollView, но он поддерживает работу как вложенного прокрутки родителя и ребенка как на новых, так и на старых версиях Android.

1st-используйте привязку NestedScrollView вместо ScrollView

2nd-установите прослушиватель прокрутки, например, чтобы обнаружить перемещение оси Y для headerView по примеру

    nestedScrollView.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {

        @Override
        public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
            Log.d(TAG, "onScrollChangeForY - scrollY: " + scrollY + " oldScrollY: " + oldScrollY);

            int MOVE = -1, SCROLL_UP = 0, SCROLL_DOWN = 1;
            float initialPositionY = headerView.getY();

            MOVE = scrollY > oldScrollY ? SCROLL_UP : SCROLL_DOWN;

            if (MOVE == SCROLL_UP) {

                int incrementY = scrollY - oldScrollY;

                headerView.setY(initialPositionY - incrementY);

            } else {

                int incrementY = oldScrollY - scrollY;

                headerView.setY(initialPositionY + incrementY);
            }
        }
    });

здесь готовый к использованию компонент, который помогает прослушивать события прокрутки произвольных представлений в Android. Внутренне этот компонент добавляет прослушиватель событий прокрутки ViewTreeObserver на устройствах со старым API Android (аналогично предложенному в ответе Шубхадипа Чаудхури) и просматривает прослушиватель событий прокрутки на устройствах с новым API Android (уровень API 23+).


просто использовать NestedScroll и NestedScroll.setOnScrollChangeListener().


начиная с API 23 Android M, вы можете использовать OnScrollChangeListener.

 scrollView.setOnScrollChangeListener(new View.OnScrollChangeListener() {
        @Override
        public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
            //work with parameters
        }
    });

вы можете использовать этот триггер, чтобы показать тост или начать деятельность

 scrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
        @Override
        public void onScrollChanged() {
             // do something when Scroll  
        }
    });