回收视图内嵌套滚动视图滚动,但不像普通回收视图或嵌套滚动视图快速滚动

我在 NestedScrollView中使用 RecyclerView,它工作正常。但是当我在 LinearLayout中使用 RecyclerView时,它会根据手势以不同的速度滚动。滚动听手势,如果我只滑动了一点点,然后它滚动了一点点,而如果我滑动真的很快,然后它滚动真的很快。现在我的问题是 NestedScrollView内部的 RecyclerView肯定会滚动,但是快速滚动不起作用。然而,我滑快或慢,RecyclerViewNestedScrollView只滚动了一点点。

我怎样才能使我的 NestedScrollViewRecyclerView在滚动视图中以不同的速度滚动?

80762 次浏览

try

recyclerView.setNestedScrollingEnabled(false);

You should wrap recycler view in any layout like LinearLayout and set RecyclerView size to constant, like 800dp. This will enable smooth scroll and recycler view will still recycler views during scroll.

<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">


<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">


<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="800dp"
app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
</LinearLayout>

I was working on android 16 where this was not possible to use setNestedSCrollEnabled method,

What I end up doing to stop RecyclerView from handling Scrolls.

Like in LinerLayoutManager i made canScrollHorizontally, canScrollVertically to return false by default.

myRecyclerView.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false){
@Override
public boolean canScrollHorizontally() {
return false;
}


@Override
public boolean canScrollVertically() {
return false;
}
});

By default setNestedScrollingEnabled works only after API-21.

You can use ViewCompat.setNestedScrollingEnabled(recyclerView, false); to disable nested scrolling for before and after API-21(Lollipop). Link to documentation.

This is WAI. The NestedScrollView measures its children with the Spec "Unspecified". The child can grow as much as it wants too.

This essentially equates the height of NSV and RV. So as far as the RV is concerned, it believes that it is completely displayed.

Wrap your RV with an LL and give your RV a height. The LL would not set the measure spec to be UNSPECIFIED so the RV would correctly scroll within its set height of whatever DPs you provide.

The only downside of this method is that you will not be able to do a match parent on your RV.

After several iterations, I came up with a solution.

  1. If you are using RecyclerView, then:

    recyclerView.setNestedScrollingEnabled(false);
    
  2. If you are using LinearLayout inside NestedScrollingView, take the LinearLayout inside a normal ScrollView and then set its scrolling to

    scrollView.setNestedScrollingEnabled(false);
    

You can use ScrollView with ExtendRecyclerView class that overrides the onMeasure method. That works for me!

@Override
protected void onMeasure(int widthSpec, int heightSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
super.onMeasure(widthSpec, expandSpec);
}
recyclerView.setNestedScrollingEnabled(false);

Will be useful sometimes.But it is not advisable for all the times.because it disables view recycling feature in recylcer view.

Alternatives:

Try CollapsiveToolbarLayout with Recycler view. put other views in collapsiveTollbar layout.

I also met this problem. And upgrade to 26.1.0 fix it.

android:overScrollMode="never

  <android.support.v4.widget.NestedScrollView
android:id="@+id/nestedScrollView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:overScrollMode="never">




<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">


<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="wrap_content" />


</LinearLayout>
</android.support.v4.widget.NestedScrollView>

In My Case i placed all images in drawable folder insted of drawable-xxxhdpi folder thats why my screen UI is lagging.