3

试过了:

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 的末尾。

4

2 回答 2

19

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

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

stopNestedScroll()->SCROLL_STATE_IDLE

startNestedScroll()->SCROLL_STATE_DRAGGING

dispatchNestedPreFling()->SCROLL_STATE_FLINGING

请不要忘记对这些方法进行超级调用。如果不这样做,您将破坏 NestedScrollView 行为

编辑:

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;
        }
    }

}
于 2016-06-06T22:15:01.923 回答
10

据我所知,最简单的方法是使用 NestedScrollView 的 setOnScrollChangeListener :

 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();
                        }
                    }
                }
            }
        });
    }
于 2017-11-27T09:56:33.333 回答