当ScrollView中的RecyclerView时,Recyclerview onscrolllistener无法正常工作

时间:2017-02-14 12:36:20

标签: android android-recyclerview android-scrollview

我想对recyclelerview进行分页,但在我的情况下,recyclerView位于ScrollView中。所以onscrollListener没有按预期工作。所以我打算找到ScrollView的滚动结束并触发下一页请求。

这是一个很好的解决方案还是有人有更好的想法?

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                  android:layout_width="match_parent"
                  android:layout_height="match_parent"
                  android:orientation="vertical">

        <ScrollView android:layout_width="match_parent"
                    android:layout_height="match_parent" android:fillViewport="false">
            <LinearLayout android:layout_width="match_parent"
                          android:orientation="vertical"
                          android:layout_height="wrap_content">


                <FrameLayout android:id="@+id/headerContainer"
                             android:layout_width="wrap_content"
                             android:layout_height="wrap_content"/>

                <android.support.v4.view.ViewPager
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"/>

            </LinearLayout>
        </ScrollView>


</LinearLayout>

1 个答案:

答案 0 :(得分:0)

您可以使用以下代码截取RecyclerView滚动条,并可以根据它微调您的滚动事件,我希望它有所帮助

mList.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
            float rawX;
            int mSlop = ViewConfiguration.get(getActivity()).getScaledTouchSlop();

            @Override
            public boolean onInterceptTouchEvent(RecyclerView v, MotionEvent event) {
                switch (event.getActionMasked()) {
                    case MotionEvent.ACTION_DOWN:
                        v.getParent().requestDisallowInterceptTouchEvent(true);
                        rawX = event.getRawX();
                        break;
                    case MotionEvent.ACTION_CANCEL:
                    case MotionEvent.ACTION_UP:
                        v.getParent().requestDisallowInterceptTouchEvent(false);
                        rawX = 0f;
                        break;
                    case MotionEvent.ACTION_MOVE:
                        if (Math.abs(rawX - event.getRawX()) > mSlop)
                            v.getParent().requestDisallowInterceptTouchEvent(true);
                        break;
                }
                return false;
            }

            @Override
            public void onTouchEvent(RecyclerView rv, MotionEvent e) {

            }

            @Override
            public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

            }
        });