Android SwipeRefreshLayout阻止RecycleView滚动

时间:2017-10-08 12:34:47

标签: android swiperefreshlayout

我在RecycleViews内部有一个水平SwipeRefreshLayout组,我在浏览页面开始时遇到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>

2 个答案:

答案 0 :(得分:0)

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

Bellow是我程序中的代码:

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

            }
}

答案 1 :(得分:0)

Zaid 回答工作正常。但是在我的情况下,我在适配器内部有水平回收视图,所以对我来说很难将适配器与活动回收器连接起来。 更简单的方法是创建自定义 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)
}