📜  android scroll view scroll end (1)

📅  最后修改于: 2023-12-03 15:13:20.565000             🧑  作者: Mango

Android ScrollView end of scroll

在Android应用程序中,当我们需要在一个可滚动的区域显示一系列的视图时,使用ScrollView是非常有用的。但是,当用户滑动到ScrollView底部时,我们可能需要在此时执行一些操作,例如自动加载更多数据等。

那么如何检测ScrollView是否已经滑动到底部呢?以下是一些解决方案。

方案一:监听ScrollView滚动事件

我们可以使用ScrollView的setOnScrollListener方法并实现OnScrollListener接口来监听ScrollView的滚动事件。此时我们可以获得ScrollView的滚动距离和子控件的高度,从而判断是否滑动到底部。

// 在Activity或Fragment中
ScrollView scrollView = findViewById(R.id.scrollView);
scrollView.setOnScrollChangeListener(new View.OnScrollChangeListener() {
    @Override
    public void onScrollChange(View view, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
        if (scrollView.getChildAt(0) != null && scrollView.getHeight() + scrollY >= scrollView.getChildAt(0).getHeight()) {
            // 此时ScrollView已经滑动到底部
        }
    }
});
方案二:扩展ScrollView

我们可以扩展ScrollView并重写onOverScrolled方法,在此方法中判断ScrollView是否已经滑动到底部。

public class CustomScrollView extends ScrollView {
    private OnScrollToEndListener mListener;

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

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

    public CustomScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public void setOnScrollToEndListener(OnScrollToEndListener listener) {
        mListener = listener;
    }

    @Override
    protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) {
        super.onOverScrolled(scrollX, scrollY, clampedX, clampedY);
        if (mListener != null && clampedY) {
            View contentView = getChildAt(getChildCount() - 1);
            if (contentView != null && contentView.getBottom() <= getHeight() + getScrollY()) {
                mListener.onScrollToEnd();
            }
        }
    }

    public interface OnScrollToEndListener {
        void onScrollToEnd();
    }
}
方案三:使用NestedScrollView

如果你使用的是Support Library中的NestedScrollView,你可以使用OnScrollChangeListener接口来监听NestedScrollView的滚动事件:

NestedScrollView nestedScrollView = findViewById(R.id.nestedScrollView);
nestedScrollView.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {
    @Override
    public void onScrollChange(NestedScrollView view, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
        if (view.getChildAt(view.getChildCount() - 1) != null && scrollY >= (view.getChildAt(view.getChildCount() - 1).getMeasuredHeight() - view.getMeasuredHeight())) {
            // 此时NestedScrollView已经滑动到底部
        }
    }
});

以上是三种检测ScrollView是否已经滑动到底部的方案。你可以根据自己的需求选择其中一种方法来实现。