ScrollView内的Recyclerview无法顺利滚动

Bar*_*ans 169 android android-scrollview android-scroll android-recyclerview

对于我的应用程序,我使用的是一个RecyclerView内部ScrollView,其RecyclerView高度基于其内容使用此库.滚动工作正在进行,但滚动时滚动不顺畅RecyclerView.当我滚动ScrollView它自己时,它滚动顺畅.

我用来定义的代码RecyclerView:

LinearLayoutManager friendsLayoutManager = new LinearLayoutManager(getActivity().getApplicationContext(), android.support.v7.widget.LinearLayoutManager.VERTICAL, false);
mFriendsListView.setLayoutManager(friendsLayoutManager);
mFriendsListView.addItemDecoration(new DividerItemDecoration(getActivity().getApplicationContext(), null));
Run Code Online (Sandbox Code Playgroud)

RecyclerViewScrollView:

<android.support.v7.widget.RecyclerView
    android:layout_marginTop="10dp"
    android:layout_marginBottom="10dp"
    android:id="@+id/friendsList"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />
Run Code Online (Sandbox Code Playgroud)

nat*_*rio 365

尝试做:

RecyclerView v = (RecyclerView) findViewById(...);
v.setNestedScrollingEnabled(false);
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用支持设计库修改布局.我猜你当前的布局是这样的:

<ScrollView >
   <LinearLayout >

       <View > <!-- upper content -->
       <RecyclerView > <!-- with custom layoutmanager -->

   </LinearLayout >
</ScrollView >
Run Code Online (Sandbox Code Playgroud)

您可以将其修改为:

<CoordinatorLayout >

    <AppBarLayout >
        <CollapsingToolbarLayout >
             <!-- with your content, and layout_scrollFlags="scroll" -->
        </CollapsingToolbarLayout >
    </AppBarLayout >

    <RecyclerView > <!-- with standard layoutManager -->

</CoordinatorLayout >
Run Code Online (Sandbox Code Playgroud)

但是,这是一个较长的路要走,如果您对自定义线性布局管理器没问题,那么只需在回收器视图上禁用嵌套滚动.

编辑(2016年4月3日)

v 23.2现在,支持库的发布包括所有默认LayoutManagers中的工厂"包装内容"功能.我没有测试它,但你应该更喜欢它你正在使用的库.

<ScrollView >
   <LinearLayout >

       <View > <!-- upper content -->
       <RecyclerView > <!-- with wrap_content -->

   </LinearLayout >
</ScrollView >
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`android:nestedScrollingEnabled ="false"`仅适用于API 21+,但`v.setNestedScrollingEnabled(false)`适用于<21. (32认同)
  • 要添加到这个答案:`setNestedScrollingEnabled(false)`只有当我为`NestedScrollView`切换``ScrollView`时才有效. (15认同)
  • 对我来说,`setNestedScrollingEnabled(false)`让我在`ScrollView`中使用我的`RecyclerView`顺利滚动 - 谢谢!但我仍然不明白为什么会这样......?将嵌套滚动设置为false意味着什么? (11认同)
  • 为了将来参考,如果有人在`ScrollView`中遇到`RecyclerView` wrap_content问题,****仅发生在marshmallow/nougat(API 23,24)设备上,请查看我的解决方法http://stackoverflow.com/a/ 132121分之38995399 (3认同)
  • 我现在遇到的这个解决方案的缺点是RecyclerView不会在它的onScrollListener中接收事件.我需要的是因为我想在回收器中只有一定数量的物品时获取更多数据 (2认同)

Vic*_*sto 76

我只需要使用它:

mMyRecyclerView.setNestedScrollingEnabled(false);
Run Code Online (Sandbox Code Playgroud)

在我的onCreateView()方法.

非常感谢!


iDe*_*per 26

您可以使用以下方式:

将此行添加到recyclerView xml:

android:nestedScrollingEnabled="false"
Run Code Online (Sandbox Code Playgroud)

或者在java代码中:

RecyclerView.setNestedScrollingEnabled(false);
Run Code Online (Sandbox Code Playgroud)

希望这有帮助.

  • 要求Api 21+ (9认同)

小智 11

您可以尝试使用XML和编程方式.但是,您可能遇到的问题(在API 21之下)通过XML执行它将无法正常工作.所以最好在Activity/Fragment中以编程方式设置它.

XML代码:

<android.support.v7.widget.RecyclerView
      android:id="@+id/recycleView"
      android:layout_width="match_parent"
      android:visibility="gone"
      android:nestedScrollingEnabled="false"
      android:layout_height="wrap_content"
      android:layout_below="@+id/linearLayoutBottomText" /> 
Run Code Online (Sandbox Code Playgroud)

编程方式:

 recycleView = (RecyclerView) findViewById(R.id.recycleView);
 recycleView.setNestedScrollingEnabled(false);
Run Code Online (Sandbox Code Playgroud)


Sid*_*cks 6

使用嵌套滚动视图而不是滚动视图解决了我的问题

<LinearLayout> <!--Main Layout -->
   <android.support.v4.widget.NestedScrollView>
     <LinearLayout > <!--Nested Scoll View enclosing Layout -->`

       <View > <!-- upper content --> 
       <RecyclerView >


     </LinearLayout > 
   </android.support.v4.widget.NestedScrollView>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)


小智 5

我遇到了类似的问题(我试图创建一个嵌套的RecyclerViews之类的东西,例如Google PlayStore设计)。解决此问题的最佳方法是将子类RecyclerViews子类化,并覆盖“ onInterceptTouchEvent”和“ onTouchEvent”方法。这样,您可以完全控制这些事件的行为方式以及最终滚动的方式。


kap*_*sid 5

用 NestedScrollView 替换 ScrollView 导致平滑滚动到底部。


mr.*_*oot 5

这里每个答案都是一样的。我已经使用了大家建议的内容。然后我发现 NestedScrollView 比 ScrollView 更快,所以

使用

<androidx.core.widget.NestedScrollView
Run Code Online (Sandbox Code Playgroud)

代替

<ScrollView
Run Code Online (Sandbox Code Playgroud)

并像往常一样使用它

recycleView.setNestedScrollingEnabled(false);
Run Code Online (Sandbox Code Playgroud)