SwipeRefreshLayout干扰ViewPager

时间:2015-07-05 02:21:07

标签: android android-layout android-fragments android-viewpager android-scrollview

我在 ViewPager 周围有一个 SwipeRefreshLayout 。 ViewPager加载的片段包含 ScrollViews 。当我向下滚动它工作正常,但当我向上滚动时, SwipeRefreshLayout 激活而不让ScrollView首先向上滚动。如何确保ScrollView具有优先权?

当SwipeRefreshLayout位于ScrollView外部的各个片段中时,它工作正常,但我需要它在ViewPager周围的活动本身。

以下是相关布局:

的活动:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="#EEEEEE"
    android:fitsSystemWindows="true">

    <include layout="@layout/toolbar" />

    <io.karim.MaterialTabs
        android:id="@+id/tabs"
        android:layout_width="match_parent"
        android:layout_height="48dp"
        android:background="@color/primary"
        app:mtIndicatorColor="@color/icons"
        app:mtIndicatorHeight="2dp"
        app:mtSameWeightTabs="true"
        app:mtPaddingMiddle="false"
        app:mtTextColorSelected="@color/icons"
        android:textColor="@color/icons"
        android:elevation="4dp"
        tools:ignore="UnusedAttribute" />

    <android.support.v4.widget.SwipeRefreshLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/swipeRefresh"
        android:layout_height="wrap_content"
        android:layout_width="match_parent">

        <android.support.v4.view.ViewPager
            android:id="@+id/pager"
            android:layout_width="match_parent"
            android:layout_height="0dp" />

    </android.support.v4.widget.SwipeRefreshLayout>

</LinearLayout>

ViewPager加载的片段(有5个标签,每个标签都有一个):

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="me.sargunvohra.android.purduediningcourts.presenter.MenuFragment">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:paddingLeft="@dimen/activity_horizontal_margin"
            android:paddingRight="@dimen/activity_horizontal_margin"
            android:paddingStart="@dimen/activity_horizontal_margin"
            android:paddingEnd="@dimen/activity_horizontal_margin"
            android:paddingTop="@dimen/activity_vertical_margin"
            android:paddingBottom="@dimen/activity_vertical_margin"
            >

            <!-- Content snipped for brevity -->

            <!-- blah blah... lots of content here -->

        </LinearLayout>

</ScrollView>

如果您需要更多信息,HERE是GitHub上的回购:

3 个答案:

答案 0 :(得分:8)

Google通过google-sample github projet上发布的示例解决了此问题。

创建一个扩展原始SwipeRefreshLayout的视图:

<com.example.android.swiperefreshmultipleviews.MultiSwipeRefreshLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:id="@+id/swiperefresh"
      android:layout_width="match_parent"
      android:layout_height="match_parent">

    <!-- your code -->

</com.example.android.swiperefreshmultipleviews.MultiSwipeRefreshLayout>

在xml布局中使用此视图:

mSwipeRefreshLayout = (MultiSwipeRefreshLayout) view.findViewById(R.id.swiperefresh);
mSwipeRefreshLayout.setSwipeableChildren(android.R.id.list, android.R.id.empty);

在您的活动或片段中,您可以将此组件用于:

DefaultValidation vs SpecialValidation

android.R.id.list和android.R.id.empty是列表或回收站视图的ID。该视图与具有相同ID的两个列表完美配合。

您可以在google-sample github project找到真实示例。

答案 1 :(得分:5)

ScrollView替换为NestedScrollView,滚动行为将按预期运行。

答案 2 :(得分:3)

我解决了这个问题。我创建了SwipeRefreshLayout,如下所示:

public class MenuSwipeRefreshLayout: SwipeRefreshLayout {

    public var target: View? = null

    constructor(ctx: Context): super(ctx)
    constructor(ctx: Context, attr: AttributeSet): super(ctx, attr)

    override fun canChildScrollUp(): Boolean {
        return target?.canScrollVertically(-1) ?: super.canChildScrollUp()
    }
}
每次ViewPager更改视图时,我都会将目标设置为可见的ScrollView。

BTW那是Kotlin,而不是Java。