对于我的应用程序,我在ScrollView
中使用RecyclerView
,其中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));
ScrollView
中的RecyclerView
:
<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" />
试着做:
RecyclerView v = (RecyclerView) findViewById(...);
v.setNestedScrollingEnabled(false);
作为一种选择,您可以使用支持设计库修改您的布局。我猜你当前的布局应该是这样的:
<ScrollView >
<LinearLayout >
<View > <!-- upper content -->
<RecyclerView > <!-- with custom layoutmanager -->
</LinearLayout >
</ScrollView >
可以修改为:
<CoordinatorLayout >
<AppBarLayout >
<CollapsingToolbarLayout >
<!-- with your content, and layout_scrollFlags="scroll" -->
</CollapsingToolbarLayout >
</AppBarLayout >
<RecyclerView > <!-- with standard layoutManager -->
</CoordinatorLayout >
然而,这是一条更长的路要走,如果你对自定义线性布局管理器满意,那么就在回收器视图上禁用嵌套滚动。
编辑(4/3/2016)
v 23.2
版本的支持库现在在所有默认的LayoutManager
中都包含了一个工厂"包装内容"特性。我没有测试它,但是你应该更喜欢它而不是你正在使用的库。
<ScrollView >
<LinearLayout >
<View > <!-- upper content -->
<RecyclerView > <!-- with wrap_content -->
</LinearLayout >
</ScrollView >
我只需要使用这个:
mMyRecyclerView.setNestedScrollingEnabled(false);
在我的onCreateView()
方法
非常感谢!
您可以这样使用:
将这行添加到您的recyclerView xml文件中:
android:nestedScrollingEnabled="false"
或者在java代码中:
RecyclerView.setNestedScrollingEnabled(false);
您可以使用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" />
以编程方式:
recycleView = (RecyclerView) findViewById(R.id.recycleView);
recycleView.setNestedScrollingEnabled(false);
使用嵌套滚动视图代替滚动视图解决了我的问题
<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>
我有类似的问题(我试图创建一个嵌套的RecyclerViews类似Google PlayStore设计)。处理这个问题的最好方法是通过子类化子RecyclerViews并重写'onInterceptTouchEvent'和'onTouchEvent'方法。通过这种方式,您可以完全控制这些事件的行为并最终滚动。
用NestedScrollView替换ScrollView可以平滑地滚动到底部。
这里的答案都是一样的。我已经用了所有人的建议。然后我发现NestedScrollView比ScrollView快,所以
使用<androidx.core.widget.NestedScrollView
不是<ScrollView
和平常一样用
recycleView.setNestedScrollingEnabled(false);
所有答案总结(优势&缺点)
For single recycleview
可以在Coordinator布局中使用。
优点 -它不会加载整个recycleview项。加载很顺利。
缺点 -你不能在协调器布局中加载两个recyclerview -它会产生滚动问题
参考- https://stackoverflow.com/a/33143512/3879847
For multiple recylerview with minimum rows
可以在NestedScrollView内加载
优势 -滚动会很顺畅
缺点 -它加载recyclerview的所有行,所以您的活动打开延迟
参考- https://stackoverflow.com/a/33143512/3879847
你必须使用recyclerview
优势 -滚动顺畅,加载顺畅
缺点 -你需要写更多的代码和逻辑
在multiviewhoders的帮助下在主recyclerview中加载每个recylerview
,
MainRecyclerview
-ChildRecyclerview1 (ViewHolder1) -ChildRecyclerview2 (ViewHolder2) -ChildRecyclerview3 (ViewHolder3) -Any other layout (ViewHolder4)
multi-viewHolder - https://stackoverflow.com/a/26245463/3879847参考
Kotlin
为滚动视图下的每个RecyclerView设置isNestedScrollingEnabled
为false
val recyclerView = findViewById<RecyclerView>(R.id.recyclerView)
recyclerView.isNestedScrollingEnabled = false
使用XML布局
<android.support.v7.widget.RecyclerView
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:id="@+id/friendsList"
android:layout_width="match_parent"
android:nestedScrollingEnabled="false"
android:layout_height="wrap_content" />
如果你在你的子视图中使用VideoView或重物小部件,保持你的RecyclerView高度为wrap_content
在高度为match_parent
的NestedScrollView中然后滚动就会像你想要的那样平滑。
通知你,
<android.support.v4.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:nestedScrollingEnabled="false"
android:layout_height="wrap_content"
android:clipToPadding="false" />
</android.support.v4.widget.NestedScrollView>
谢谢微这是从你的提示!
karthik
你可以使用ScrollView作为父视图,而NestedScrollView作为子视图。这样的:-
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/CL1">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/eventRV"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/CL1" />
</androidx.core.widget.NestedScrollView>
<android.support.v4.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clipToPadding="false" />
</android.support.v4.widget.NestedScrollView>
recycleView = (RecyclerView) findViewById(R.id.recycleView);
recycleView.setNestedScrollingEnabled(false);
或者您可以在回收器视图中设置android:focusableInTouchMode="true"
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v4.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent">
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent">
<android.support.constraint.ConstraintLayout
android:id="@+id/constraintlayout_main"
android:layout_width="match_parent"
android:layout_height="@dimen/layout_width_height_fortyfive"
android:layout_marginLeft="@dimen/padding_margin_sixteen"
android:layout_marginRight="@dimen/padding_margin_sixteen"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent">
<TextView
android:id="@+id/textview_settings"
style="@style/textviewHeaderMain"
android:gravity="start"
android:text="@string/app_name"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent" />
</android.support.constraint.ConstraintLayout>
<android.support.constraint.ConstraintLayout
android:id="@+id/constraintlayout_recyclerview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/padding_margin_zero"
android:layout_marginTop="@dimen/padding_margin_zero"
android:layout_marginEnd="@dimen/padding_margin_zero"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/constraintlayout_main">
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:nestedScrollingEnabled="false"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent" />
</android.support.constraint.ConstraintLayout>
</android.support.constraint.ConstraintLayout>
</android.support.v4.widget.NestedScrollView>
</android.support.constraint.ConstraintLayout>
这段代码是在ConstraintLayout android
简单添加这行到你的JAVA类
list.setNestedScrollingEnabled(false);
我自己就有这个问题,在滚动视图中有一个回收器视图,滚动似乎不光滑。我的问题的原因是在回收器视图的顶部有滚动视图,这是不需要我的要求。因此,在我删除滚动视图并添加android:scrollbars="vertical"
用于回收视图后,滚动是平滑的。
经过3天的研究,我解决了项目中的平滑滚动问题。
问题是<layer-list>
可绘制设置在item_user.xml
文件的背景,所以它需要GPU时间来渲染,这就是为什么滚动不光滑。因此,请不要在适配器项目的背景中使用复杂的<layer-list>
绘制。
我的问题已经用上面的方法解决了,下面的选项对我没用
- setNestedScrollingEnabled
- setHasFixedSize
- setItemViewCacheSize