我在 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上的回购:
答案 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。