Android scrollview на ScrollChanged - PullRequest
       23

Android scrollview на ScrollChanged

22 голосов
/ 24 ноября 2010

У меня фиксированный контент в текстовом представлении внутри прокрутки. Когда пользователь прокручивает до определенной позиции, я хотел бы начать действие или вызвать 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 для определения положения представления прокрутки.

Я нашел этот ответ. Есть ли более простое решение, чем объявление интерфейса, прокрутка прокрутки и т. Д., Как видно по ссылке, которую я разместил?

Ответы [ 10 ]

48 голосов
/ 04 июля 2013

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

Поскольку объект ViewTreeObserver может измениться в течение времени жизни ScrollView, нам необходимо зарегистрировать OnTouchListener на ScrollView, чтобы получить ViewTreeObserver во время прокрутки.

final ViewTreeObserver.OnScrollChangedListener onScrollChangedListener = new
                           ViewTreeObserver.OnScrollChangedListener() {

    @Override
    public void onScrollChanged() {
        //do stuff here 
    }
};

final ScrollView scrollView = (ScrollView) findViewById(R.id.scroller);
scrollView.setOnTouchListener(new View.OnTouchListener() {
    private ViewTreeObserver observer;

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (observer == null) {
            observer = scrollView.getViewTreeObserver();
            observer.addOnScrollChangedListener(onScrollChangedListener);
        }
        else if (!observer.isAlive()) {
            observer.removeOnScrollChangedListener(onScrollChangedListener);
            observer = scrollView.getViewTreeObserver();
            observer.addOnScrollChangedListener(onScrollChangedListener);
        }

        return false;
    }
});
13 голосов
/ 24 ноября 2010

Нет.

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

9 голосов
/ 18 апреля 2016

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

Начиная с API 23 , Android View имеет OnScrollChangeListener и match setter .

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

8 голосов
/ 16 апреля 2012

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

2 голосов
/ 18 апреля 2016

Я расширил свой 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);
    }
}
1 голос
/ 12 декабря 2017

NestedScrollView аналогичен android.widget.ScrollView, но поддерживает как вложенный прокручиваемый родительский, так и дочерний элементы в новых и старых версиях Android.

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

2nd - Установите прослушиватель Scroll, например, так, чтобы он обнаруживал перемещение оси 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);
            }
        }
    });
0 голосов
/ 26 марта 2018

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

 scrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
        @Override
        public void onScrollChanged() {
             // do something when Scroll  
        }
    });
0 голосов
/ 28 ноября 2017

Начиная с 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
        }
    });
0 голосов
/ 13 июня 2017

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

0 голосов
/ 18 мая 2017

Просто используйте NestedScroll и NestedScroll.setOnScrollChangeListener().

...