API 19 Scrollview 没有动力
API 19 Scrollview no momentum
我在 CoordinatorLayout 中有一个 NestedScrollView,它包含一个 recyclerView。整个片段很长,没有滚动动量,我不确定我能做些什么来修复它。我以前在更高的 Android 版本中遇到过这个问题,并且能够包含
android:nestedScrollingEnabled="false"
解决我的问题。但是,这是在 api 21 中添加的,我的项目支持 19+。对于 api 19 台设备,我的应用在这个片段上仍然没有动力。
下面是我的xml:
<android.support.design.widget.CoordinatorLayout
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_height="match_parent"
android:layout_width="match_parent"
android:background="@color/primary_color"
android:fitsSystemWindows="true">
<android.support.v4.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="android.support.design.widget.AppBarLayout$ScrollingViewBehavior">
<android.support.percent.PercentRelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:nestedScrollingEnabled="false">
<ImageView
android:id="@+id/logo"
android:src="@drawable/logo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/profile_margin_medium_huge"
android:layout_marginBottom="46dp"
android:layout_marginRight="@dimen/activity_horizontal_margin"
android:layout_marginLeft="@dimen/activity_horizontal_margin"
android:layout_alignParentEnd="true"/>
<TypefaceTextView
android:id="@+id/textview_title"
android:layout_below="@id/logo"
android:text="@string/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/myStyle"
android:layout_marginLeft="@dimen/activity_horizontal_margin"
android:layout_marginRight="@dimen/activity_horizontal_margin"
android:layout_marginBottom="16dp"
android:layout_alignParentLeft="true"/>
<TypefaceTextView
android:id="@+id/textview_byline"
android:text="@string/byline"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/myStyle"
android:layout_below="@id/textview_title"
android:layout_marginLeft="@dimen/activity_horizontal_margin"
android:layout_marginRight="@dimen/activity_horizontal_margin"
android:layout_marginBottom="40dp"/>
<RadioGroup
android:id="@+id/radiogroup_filter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_below="@id/textview_byline"
android:layout_alignParentRight="true"
android:layout_marginLeft="@dimen/activity_horizontal_margin"
android:layout_marginRight="@dimen/activity_horizontal_margin"
android:layout_marginBottom="@dimen/activity_vertical_margin">
<TypefaceRadioButton
android:id="@+id/button_filter_new"
android:text="@string/filter_new"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/buttonStyleRadio"
android:theme="@style/ButtonSecondary"
android:button="@null"/>
<TypefaceRadioButton
android:id="@+id/button_filter_history"
android:text="@string/filter_history"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/ButtonStyleRadio"
android:theme="@style/ButtonSecondary"
android:layout_alignParentRight="true"
android:button="@null"/>
</RadioGroup>
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview"
android:nestedScrollingEnabled="false"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/radiogroup_filter"
android:layout_marginLeft="@dimen/activity_horizontal_margin"
android:layout_marginRight="@dimen/activity_horizontal_margin"
android:layout_marginBottom="50dp"/>
<android.support.percent.PercentRelativeLayout
android:id="@+id/container_links"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/recyclerview"
android:visibility="gone">
<ImageView
android:id="@+id/image_link_1"
app:layout_widthPercent="100%"
app:layout_aspectRatio="158%"
android:scaleType="centerCrop"
android:layout_alignParentTop="true"/>
<TypefaceTextView
android:id="@+id/text_link_1"
android:text="@string/text_1"
app:layout_widthPercent="100%"
app:layout_aspectRatio="158%"
android:gravity="bottom|left"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="32dp"
android:paddingBottom="32dp"
style="@style/myStyle"
android:layout_alignParentTop="true"/>
<ImageView
android:id="@+id/image_link_2"
app:layout_widthPercent="100%"
app:layout_aspectRatio="158%"
android:scaleType="centerCrop"
android:layout_below="@id/image_link_1"/>
<TypefaceTextView
android:id="@+id/text_link_2"
android:text="@string/text_2"
app:layout_widthPercent="100%"
app:layout_aspectRatio="158%"
android:gravity="bottom|right"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="32dp"
android:paddingBottom="32dp"
android:layout_below="@id/image_link_1"
style="@style/myStyle"/>
</android.support.percent.PercentRelativeLayout>
</android.support.percent.PercentRelativeLayout>
</android.support.v4.widget.NestedScrollView>
我能够在我的测试项目中重现您的症状。我修复了它,在 activity:
的 onCreate() 中添加了以下代码
final RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
recyclerView.setOnFlingListener(new RecyclerView.OnFlingListener() {
@Override
public boolean onFling(int velocityX, int velocityY) {
recyclerView.dispatchNestedFling(velocityX, velocityY, false);
return false;
}
});
我向 RecyclerView 添加了一个 fling 侦听器,并在 onFling() 中调用 dispatchNestedFling() 让 parent 知道正在发生一个 fling。然后,parent 可以消耗该 fling 或观察 child fling。
dispatchNestedFling
added in version 22.1.0
boolean dispatchNestedFling (float velocityX,
float velocityY,
boolean consumed) Dispatch a fling to a nested scrolling parent.
This method should be used to indicate that a nested scrolling child
has detected suitable conditions for a fling. Generally this means
that a touch scroll has ended with a velocity in the direction of
scrolling that meets or exceeds the minimum fling velocity along a
scrollable axis.
If a nested scrolling child view would normally fling but it is at the
edge of its own content, it can use this method to delegate the fling
to its nested scrolling parent instead. The parent may optionally
consume the fling or observe a child fling.
这在我的模拟器上运行 运行 API 19. 显然,YMMV。
有一个更简单的方法:
Java
recyclerView.setNestedScrollingEnabled(false);
Kotlin
recyclerView.isNestedScrollingEnabled = false
我在 CoordinatorLayout 中有一个 NestedScrollView,它包含一个 recyclerView。整个片段很长,没有滚动动量,我不确定我能做些什么来修复它。我以前在更高的 Android 版本中遇到过这个问题,并且能够包含
android:nestedScrollingEnabled="false"
解决我的问题。但是,这是在 api 21 中添加的,我的项目支持 19+。对于 api 19 台设备,我的应用在这个片段上仍然没有动力。
下面是我的xml:
<android.support.design.widget.CoordinatorLayout
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_height="match_parent"
android:layout_width="match_parent"
android:background="@color/primary_color"
android:fitsSystemWindows="true">
<android.support.v4.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="android.support.design.widget.AppBarLayout$ScrollingViewBehavior">
<android.support.percent.PercentRelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:nestedScrollingEnabled="false">
<ImageView
android:id="@+id/logo"
android:src="@drawable/logo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/profile_margin_medium_huge"
android:layout_marginBottom="46dp"
android:layout_marginRight="@dimen/activity_horizontal_margin"
android:layout_marginLeft="@dimen/activity_horizontal_margin"
android:layout_alignParentEnd="true"/>
<TypefaceTextView
android:id="@+id/textview_title"
android:layout_below="@id/logo"
android:text="@string/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/myStyle"
android:layout_marginLeft="@dimen/activity_horizontal_margin"
android:layout_marginRight="@dimen/activity_horizontal_margin"
android:layout_marginBottom="16dp"
android:layout_alignParentLeft="true"/>
<TypefaceTextView
android:id="@+id/textview_byline"
android:text="@string/byline"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/myStyle"
android:layout_below="@id/textview_title"
android:layout_marginLeft="@dimen/activity_horizontal_margin"
android:layout_marginRight="@dimen/activity_horizontal_margin"
android:layout_marginBottom="40dp"/>
<RadioGroup
android:id="@+id/radiogroup_filter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_below="@id/textview_byline"
android:layout_alignParentRight="true"
android:layout_marginLeft="@dimen/activity_horizontal_margin"
android:layout_marginRight="@dimen/activity_horizontal_margin"
android:layout_marginBottom="@dimen/activity_vertical_margin">
<TypefaceRadioButton
android:id="@+id/button_filter_new"
android:text="@string/filter_new"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/buttonStyleRadio"
android:theme="@style/ButtonSecondary"
android:button="@null"/>
<TypefaceRadioButton
android:id="@+id/button_filter_history"
android:text="@string/filter_history"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/ButtonStyleRadio"
android:theme="@style/ButtonSecondary"
android:layout_alignParentRight="true"
android:button="@null"/>
</RadioGroup>
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview"
android:nestedScrollingEnabled="false"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/radiogroup_filter"
android:layout_marginLeft="@dimen/activity_horizontal_margin"
android:layout_marginRight="@dimen/activity_horizontal_margin"
android:layout_marginBottom="50dp"/>
<android.support.percent.PercentRelativeLayout
android:id="@+id/container_links"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/recyclerview"
android:visibility="gone">
<ImageView
android:id="@+id/image_link_1"
app:layout_widthPercent="100%"
app:layout_aspectRatio="158%"
android:scaleType="centerCrop"
android:layout_alignParentTop="true"/>
<TypefaceTextView
android:id="@+id/text_link_1"
android:text="@string/text_1"
app:layout_widthPercent="100%"
app:layout_aspectRatio="158%"
android:gravity="bottom|left"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="32dp"
android:paddingBottom="32dp"
style="@style/myStyle"
android:layout_alignParentTop="true"/>
<ImageView
android:id="@+id/image_link_2"
app:layout_widthPercent="100%"
app:layout_aspectRatio="158%"
android:scaleType="centerCrop"
android:layout_below="@id/image_link_1"/>
<TypefaceTextView
android:id="@+id/text_link_2"
android:text="@string/text_2"
app:layout_widthPercent="100%"
app:layout_aspectRatio="158%"
android:gravity="bottom|right"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="32dp"
android:paddingBottom="32dp"
android:layout_below="@id/image_link_1"
style="@style/myStyle"/>
</android.support.percent.PercentRelativeLayout>
</android.support.percent.PercentRelativeLayout>
</android.support.v4.widget.NestedScrollView>
我能够在我的测试项目中重现您的症状。我修复了它,在 activity:
的 onCreate() 中添加了以下代码final RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
recyclerView.setOnFlingListener(new RecyclerView.OnFlingListener() {
@Override
public boolean onFling(int velocityX, int velocityY) {
recyclerView.dispatchNestedFling(velocityX, velocityY, false);
return false;
}
});
我向 RecyclerView 添加了一个 fling 侦听器,并在 onFling() 中调用 dispatchNestedFling() 让 parent 知道正在发生一个 fling。然后,parent 可以消耗该 fling 或观察 child fling。
dispatchNestedFling
added in version 22.1.0 boolean dispatchNestedFling (float velocityX, float velocityY, boolean consumed) Dispatch a fling to a nested scrolling parent.
This method should be used to indicate that a nested scrolling child has detected suitable conditions for a fling. Generally this means that a touch scroll has ended with a velocity in the direction of scrolling that meets or exceeds the minimum fling velocity along a scrollable axis.
If a nested scrolling child view would normally fling but it is at the edge of its own content, it can use this method to delegate the fling to its nested scrolling parent instead. The parent may optionally consume the fling or observe a child fling.
这在我的模拟器上运行 运行 API 19. 显然,YMMV。
有一个更简单的方法:
Java
recyclerView.setNestedScrollingEnabled(false);
Kotlin
recyclerView.isNestedScrollingEnabled = false