Android SwipeRefreshLayout 停止 RecycleView 滚动

Android SwipeRefreshLayout stops RecycleView from scrolling

我在 SwipeRefreshLayout 中有一个水平组 RecycleViews,我在滑动页面开头的 Recycleviews 时遇到了问题,因为它一直停止它并检测到刷新滑动。

如何阻止这种情况发生?

或者有什么方法只在不滑动时触发刷新?

此外,这是实现我想要的布局的最佳方式吗?

<android.support.v4.widget.SwipeRefreshLayout
    android:id="@+id/activity_main_swipe_refresh_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginBottom="70dp"
                android:isScrollContainer="false"
                android:orientation="vertical">


                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:background="@drawable/block_border"
                    android:orientation="vertical">

                    <TextView
                        android:id="@+id/trending_episodes_title"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content" />

                    <!--This is the first affected recycle  -->

                    <android.support.v7.widget.RecyclerView
                        android:id="@+id/trendingEpisodesRecycle"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:clipToPadding="false"
                        android:orientation="horizontal" />

                </LinearLayout>


                <!--This is the Second affected recycle  -->

                <android.support.v7.widget.RecyclerView
                    android:id="@+id/allNewsRecycle"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="@dimen/title_top"
                    android:clipToPadding="false"
                    android:orientation="horizontal" />

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:background="@drawable/block_border"
                    android:orientation="vertical">

                    <TextView
                        android:id="@+id/moods_title"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"

                        android:layout_marginTop="@dimen/title_top"
                        android:textColor="@color/colorBlack"
                        android:textSize="20sp"
                        android:textStyle="bold" />

                    <android.support.v7.widget.RecyclerView
                        android:id="@+id/moodsRecycle"
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:clipToPadding="false"
                        android:orientation="horizontal" />

                </LinearLayout>
            </LinearLayout>
        </RelativeLayout>
    </ScrollView>
</android.support.v4.widget.SwipeRefreshLayout>

好的,所以我解决了这个问题,方法是在触摸 RecycleView 时禁用 SwipeRefreshLayout,并在用户放开 RecycleView 后重新启用它。

下面是我程序中的代码:

        MyRecycleView.addOnScrollListener(new RecyclerView.OnScrollListener() {

            @Override
            public void onScrollStateChanged(final RecyclerView recyclerView, int newState)
            {

                super.onScrollStateChanged(recyclerView,newState);
                if (newState != RecyclerView.SCROLL_STATE_IDLE) { // on scroll stop
                    mSwipeRefreshLayout.setEnabled(false);
                }
                else
                {
                    mSwipeRefreshLayout.setEnabled(true);
                }

            }
}

Zaid 的回答很好。但就我而言,我在适配器内部有水平回收视图,所以对我来说很难将适配器与 activity 回收器连接。 更简单的方法是创建自定义 VerticalRefreshLayout 并使用它代替 SwipeRefreshLayout。

Kotlin 解决方案:

class VerticalRefreshLayout(context: Context?, attrs: AttributeSet?) : SwipeRefreshLayout(context!!, attrs) {
private val mTouchSlop: Int = ViewConfiguration.get(context).scaledTouchSlop
private var mPrevX = 0f
@SuppressLint("Recycle")
override fun onInterceptTouchEvent(event: MotionEvent): Boolean {
    when (event.action) {
        MotionEvent.ACTION_DOWN -> mPrevX = MotionEvent.obtain(event).x
        MotionEvent.ACTION_MOVE -> {
            val eventX = event.x
            val xDiff = abs(eventX - mPrevX)
            if (xDiff > mTouchSlop) {
                return false
            }
        }
    }
    return super.onInterceptTouchEvent(event)
}