如何确定嵌套滚动视图是否滚动到末尾并且处于空闲状态



试过:

NestedScrollView ns =(NestedScrollView) findViewById(R.id.nested_scroll);
        ns.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {
            @Override
            public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
            }
        });

但是卡住了,有人有想法吗?

只是为了澄清我想要什么 - 我希望能够观察滚动状态(如在 recyclerView 的 addOnScrollListener 中),并且只检查一次,当滚动结束(空闲)时,如果用户滚动到嵌套滚动视图的末尾。

不幸的是,NestedScrollView不支持调度滚动状态的实现,因为它是完全不同的滚动视图。简单地说,它与Scroller FrameLayout.

通常,当ViewCompat.canScrollVertically (scrollView, -1)返回 false 时,会到达滚动视图的末尾。对于滚动状态,您需要NestedScrollView子类并添加自己的接口,类似于RecyclerView 的接口。应在以下重写方法中调用接口方法:

stopNestedScroll() -> SCROLL_STATE_IDLE

startNestedScroll() -> SCROLL_STATE_DRAGGING

dispatchNestedPreFling() -> SCROLL_STATE_FLINGING

请不要忘记对这些方法进行超级调用。如果不这样做,您将破坏嵌套滚动视图行为

编辑:

public class NestedScrollingView extends NestedScrollView {
    private int mState = RecyclerView.SCROLL_STATE_IDLE;
    public interface NestedScrollViewScrollStateListener {
        void onNestedScrollViewStateChanged(int state);
    }

    public void setScrollListener(NestedScrollViewScrollStateListener scrollListener) {
        this.mScrollListener = scrollListener;
    }
    private NestedScrollViewScrollStateListener mScrollListener;
    public NestedScrollingView(Context context) {
        super(context);
    }
    public NestedScrollingView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    public NestedScrollingView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
    @Override
    public void stopNestedScroll() {
        super.stopNestedScroll();
        dispatchScrollState(RecyclerView.SCROLL_STATE_IDLE);
    }
    @Override
    public boolean onStartNestedScroll(View child, View target, int nestedScrollAxes) {
        dispatchScrollState(RecyclerView.SCROLL_STATE_DRAGGING);
        return super.onStartNestedScroll(child, target, nestedScrollAxes);
    }

    @Override
    public boolean startNestedScroll(int axes) {
        boolean superScroll = super.startNestedScroll(axes);
        dispatchScrollState(RecyclerView.SCROLL_STATE_DRAGGING);
        return superScroll;
    }

    private void dispatchScrollState(int state) {
        if (mScrollListener != null && mState != state) {
            mScrollListener.onNestedScrollViewStateChanged(state);
            mState = state;
        }
    }
}
我知道

最简单的方法是使用 setOnScrollChangeListener of NestedScrollView :

 NestedScrollView nestedSV = (NestedScrollView) findViewById(R.id.nested_sync_scrollview);
    if (nestedSV != null) {
        nestedSV.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {
            @Override
            public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
                String TAG = "nested_sync";
                if (scrollY > oldScrollY) {
                    Log.i(TAG, "Scroll DOWN");
                }
                if (scrollY < oldScrollY) {
                    Log.i(TAG, "Scroll UP");
                }
                if (scrollY == 0) {
                    Log.i(TAG, "TOP SCROLL");
                }
                if (scrollY == (v.getChildAt(0).getMeasuredHeight() - v.getMeasuredHeight())) {
                    Log.i(TAG, "BOTTOM SCROLL");
                    if (!isRecyclerViewWaitingtoLaadData) //check for scroll down
                    {
                        if (!loadedAllItems) {
                            showUnSentData();
                        }
                    }
                }
            }
        });
    }

最新更新