Как вызвать событие, когда scrollView достигнет дна с Android? - PullRequest
12 голосов
/ 27 августа 2009

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

Например, мой список предметов должен быть дополнен автоматически.

Есть идеи, как это можно сделать?

Я благодарен за любой совет.

Ответы [ 4 ]

8 голосов
/ 31 мая 2015

Пожалуйста, прочитайте эту статью: Android: понимание того, когда Scrollview достиг дна

Исходный код:

@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) 
{
    // Grab the last child placed in the ScrollView, we need it to determinate the bottom position.
    View view = (View) getChildAt(getChildCount()-1);

    // Calculate the scrolldiff
    int diff = (view.getBottom()-(getHeight()+getScrollY()));

    // if diff is zero, then the bottom has been reached
    if( diff == 0 )
    {
        // notify that we have reached the bottom
        Log.d(ScrollTest.LOG_TAG, "MyScrollView: Bottom has been reached" );
    }

    super.onScrollChanged(l, t, oldl, oldt);
}

Если вы хотите, вы можете добавить сделать собственный виджет.

Пример:

package se.marteinn.ui;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.ScrollView;


/**
 * Triggers a event when scrolling reaches bottom.
 *
 * Created by martinsandstrom on 2010-05-12.
 * Updated by martinsandstrom on 2014-07-22.
 *
 * Usage:
 *
 *  scrollView.setOnBottomReachedListener(
 *      new InteractiveScrollView.OnBottomReachedListener() {
 *          @Override
 *          public void onBottomReached() {
 *              // do something
 *          }
 *      }
 *  );
 * 
 *
 * Include in layout:
 *  
 *  <se.marteinn.ui.InteractiveScrollView
 *      android:layout_width="match_parent"
 *      android:layout_height="match_parent" />
 *  
 */
public class InteractiveScrollView extends ScrollView {
    OnBottomReachedListener mListener;

    public InteractiveScrollView(Context context, AttributeSet attrs,
            int defStyle) {
        super(context, attrs, defStyle);
    }

    public InteractiveScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public InteractiveScrollView(Context context) {
        super(context);
    }

    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        View view = (View) getChildAt(getChildCount()-1);
        int diff = (view.getBottom()-(getHeight()+getScrollY()));

        if (diff == 0 && mListener != null) {
            mListener.onBottomReached();
        }

        super.onScrollChanged(l, t, oldl, oldt);
    }


    // Getters & Setters

    public OnBottomReachedListener getOnBottomReachedListener() {
        return mListener;
    }

    public void setOnBottomReachedListener(
            OnBottomReachedListener onBottomReachedListener) {
        mListener = onBottomReachedListener;
    }


    /**
     * Event listener.
     */
    public interface OnBottomReachedListener{
        public void onBottomReached();
    }

}
2 голосов
/ 02 апреля 2012

У меня была та же проблема, и я решил ее, используя ListView (автоматически добавляет ScrollView при необходимости) и установив OnScrollListener .

Вот пример кода:

        tableListView.setOnScrollListener(new OnScrollListener() {

        public void onScrollStateChanged(AbsListView view, int scrollState) {

        }

        public void onScroll(AbsListView view, int firstVisibleItem,
                int visibleItemCount, int totalItemCount) {
            if (visibleItemCount == totalItemCount)
            // too little items (ScrollView not needed)
            {
                java.lang.System.out.println("too little items to use a ScrollView!");
            }
            else {
                if ((firstVisibleItem + visibleItemCount) == totalItemCount) {
                    // put your stuff here
                    java.lang.System.out.println("end of the line reached!");
                }
            }

        }
    });
0 голосов
/ 31 января 2019

Не пытайтесь SetOnScrollChangeListener, если вы работаете с Android API ниже 21 (Android M), вы можете попробовать это:

yourScrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
            @Override
            public void onScrollChanged() {
                int rootHeight = yourScrollView.getHeight();
                int childHeight = yourScrollView.getChildAt(0).getHeight();
                int scrollY = yourScrollView.getScrollY();
                if(childHeight - rootHeight == scrollY)
                Log.d("Hei","You Have Reach The End!");
            }
        });
0 голосов
/ 21 апреля 2016

Вот гораздо более простое решение без необходимости прокручивать представление подкласса. Предполагая, что у вас есть переменная RecyclerView recyclerView,

recyclerView.computeVerticalScrollRange () предоставляет полный диапазон прокрутки или, другими словами, высоту содержимого.

(recyclerView.computeVerticalScrollOffset () дает смещение от вершины при прокрутке. Это значение будет продолжаться до высоты содержимого - высоты представления прокрутки.

Итак,

    if( (recyclerView.computeVerticalScrollOffset() == 
(recyclerView.computeVerticalScrollRange() - recyclerView.getHeight()) ) {
    // You have hit rock bottom.
    }

Манипулирование дочерним представлением представления с прокруткой кажется таким забавным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...