ScrollView嵌套LinearLayout内双RecyclerView时无法显示全部项
解决ScrollView嵌套RecyclerView显示不全的问题
这个问题我之前也踩过坑,核心原因是ScrollView和RecyclerView都是滚动容器,嵌套时RecyclerView的wrap_content属性无法正确计算自身高度,导致只能显示部分列表项。下面给你几个实用的解决方案:
方案一:自定义RecyclerView重写onMeasure方法
通过自定义RecyclerView,强制它在wrap_content模式下计算出所有item的总高度。代码如下:
public class FullHeightRecyclerView extends RecyclerView { public FullHeightRecyclerView(Context context) { super(context); } public FullHeightRecyclerView(Context context, AttributeSet attrs) { super(context, attrs); } public FullHeightRecyclerView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onMeasure(int widthSpec, int heightSpec) { // 把高度测量模式改为AT_MOST,让RecyclerView能计算所有item的总高度 int heightSpecCustom = MeasureSpec.makeMeasureSpec( Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthSpec, heightSpecCustom); ViewGroup.LayoutParams params = getLayoutParams(); params.height = getMeasuredHeight(); } }
然后在布局里替换原来的RecyclerView为这个自定义的FullHeightRecyclerView即可。
方案二:用NestedScrollView替代ScrollView
Android官方提供的NestedScrollView专门用于处理嵌套滚动场景,搭配RecyclerView的setNestedScrollingEnabled(false)可以完美解决显示问题:
- 把布局里的
ScrollView替换为androidx.core.widget.NestedScrollView - 在代码里给两个RecyclerView设置禁用嵌套滚动:
recyclerView1.setNestedScrollingEnabled(false); recyclerView2.setNestedScrollingEnabled(false);
这个方案不用自定义View,操作更简单,推荐优先尝试。
方案三:重构布局避免嵌套滚动(最优解)
如果你的页面不需要整体滚动,只是两个列表上下排列,其实可以把两个列表合并成一个RecyclerView,通过多类型Item布局来实现。这样既避免了滚动嵌套的性能问题,也从根源上解决了显示不全的问题。
比如给RecyclerView的Adapter添加两种Item类型,分别对应原来两个列表的布局,这样整个页面只用一个RecyclerView,不需要外层的ScrollView。
小提示:滚动嵌套会影响RecyclerView的回收复用机制,导致性能下降,所以能重构布局的话尽量优先选择方案三。
内容的提问来源于stack exchange,提问作者Mehdi bahmanpour
相关产品推荐
相关产品推荐

