NestedScrollView嵌套RecyclerView出现加载慢、应用无响应如何解决?
问题根因
你当前布局的核心问题是:放在NestedScrollView内部的RecyclerView使用了android:layout_height="wrap_content"属性,这会导致RecyclerView失去视图复用特性,需要一次性渲染所有列表项,当列表数据量稍大时就会占用大量CPU资源,引发卡顿、加载慢、ANR问题,和是否关闭嵌套滑动没有直接关系,属于RecyclerView的经典误用场景。
可行解决方案
以下方案按优先级从高到低排列:
方案1:重构布局为单RecyclerView(最优)
完全移除NestedScrollView,把整个页面的所有元素都作为RecyclerView的不同item类型加载:
- 顶部的横向分类RecyclerView作为第一个Header类型的item
- 轮播图作为第二个Header类型的item
- 原本的商品列表作为普通内容item
- 给最终的RecyclerView设置
android:layout_height="match_parent",完整保留复用特性,性能最优,可彻底解决卡顿问题。
方案2:适配现有布局修改高度(次优,改动量小)
如果不想大改现有布局结构,可按以下步骤调整:
- 给
NestedScrollView添加fillViewport属性:
<androidx.core.widget.NestedScrollView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/framelayout_category" android:fillViewport="true">
- 修改内部
rv_home_items的高度属性为match_parent:
<androidx.recyclerview.widget.RecyclerView android:id="@+id/rv_home_items" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/image_slider" android:layout_marginBottom="50dp" />
- 保留你现有的关闭嵌套滑动代码即可,调整后RecyclerView只会渲染可见区域的item,不会一次性加载所有内容。
方案3:临时验证补丁(仅用于确认问题,不建议线上使用)
如果需要先快速验证根因是否正确,可以先给rv_home_items写死一个固定高度比如android:layout_height="800dp",运行后如果卡顿、ANR问题消失,即可确认是高度设置错误导致的问题,再选择上述两个方案落地即可。
额外优化建议
- 顶部的横向分类RecyclerView
rv_home_categories也建议设置固定高度,不要用wrap_content,避免不必要的多次重绘 - 检查两个RecyclerView的Adapter是否存在冗余绑定逻辑、同步加载大图逻辑,避免item绑定阶段耗时过长
内容的提问来源于stack exchange,提问作者Codist
相关产品推荐
相关产品推荐

