You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

嵌套RecyclerView分组滚动时出现卡顿问题

Fixing Nested RecyclerView Scroll Lag in Google Inbox Clone

Let's break down the key issues and fixes to get your scroll performance back on track:

1. Fix RecyclerView Height Configuration

The biggest culprit here is likely the wrap_content height on your outer RecyclerView. This forces it to measure every child view upfront, completely defeating the purpose of view recycling.

  • Update the outer RecyclerView's height to match_parent:
<android.support.v7.widget.RecyclerView
    android:id="@+id/lista"
    android:layout_width="match_parent"
    android:layout_height="match_parent" <!-- Replace wrap_content -->
    android:scrollbarSize="4dp"
    android:scrollbarThumbVertical="@color/lightgray"
    android:scrollbars="vertical">
</android.support.v7.widget.RecyclerView>

For your inner horizontal RecyclerView (inside the CardView), set a fixed height instead of wrap_content to avoid repeated layout calculations:

<android.support.v7.widget.RecyclerView
    android:id="@+id/lista_noticias"
    android:layout_width="match_parent"
    android:layout_height="220dp" <!-- Fixed height matching your content -->
    android:layout_marginTop="8dp"
    android:clipToPadding="false">
</android.support.v7.widget.RecyclerView>

2. Clean Up AppBar Layout Behavior

Your main FrameLayout uses app:layout_behavior="@string/appbar_scrolling_view_behavior" but there's no AppBarLayout present. This is unnecessary and adds extra layout overhead—remove that attribute:

<FrameLayout
    android:id="@+id/content_frame"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    <!-- Remove app:layout_behavior line here -->
    android:background="#FFE7E8ED">

If you want scrollable toolbar functionality later, wrap your Toolbar in a proper AppBarLayout.

3. Optimize RecyclerView Settings

Enable Fixed Size

Add setHasFixedSize(true) to both outer and inner RecyclerViews. This tells the system their size won't change, skipping redundant layout calculations:

// Outer RecyclerView setup
RecyclerView outerRv = findViewById(R.id.lista);
outerRv.setHasFixedSize(true);
outerRv.setLayoutManager(new LinearLayoutManager(this));

// Inner RecyclerView setup (in your outer adapter's onCreateViewHolder)
RecyclerView innerRv = itemView.findViewById(R.id.lista_noticias);
innerRv.setHasFixedSize(true);
innerRv.setLayoutManager(new LinearLayoutManager(itemView.getContext(), LinearLayoutManager.HORIZONTAL, false));

Disable Nested Scrolling for Inner Lists

Since you're scrolling the outer list, inner RecyclerViews don't need to handle nested scroll events. Disable this to avoid scroll conflicts:

innerRv.setNestedScrollingEnabled(false);

Refine View Pool Usage

You're already sharing a ViewPool, which is great—just make sure you initialize it once and pass it to all inner RecyclerViews consistently:

// Initialize once in your Activity/Fragment
RecyclerView.RecycledViewPool viewPool = new RecyclerView.RecycledViewPool();

// In outer adapter's onCreateViewHolder
innerRv.setRecycledViewPool(viewPool);

4. Optimize ViewHolder and Binding Logic

  • Use static ViewHolder classes in both adapters to avoid memory leaks and speed up view access.
  • Move any heavy calculations (like string formatting, data processing) out of onBindViewHolder—precompute this data when loading from your local database.
  • Cache all views in your ViewHolder (call findViewById only once per ViewHolder).

5. Additional Performance Checks

  • Test in Release Mode: Debug mode adds overhead (strict mode, debug logging) that can cause false lag. Always test performance in a release build with minify enabled.
  • Check for Overdraw: Use Android Studio's Layout Inspector to identify unnecessary backgrounds or overlapping views. Remove redundant backgrounds to reduce GPU workload.
  • Profile Memory: Use Android Studio's Memory Profiler to check for memory leaks or excessive object allocations during scrolling. This can reveal if your adapters are holding onto unused references.

These changes should eliminate most of the scroll jank you're experiencing. Let me know if you need help with any specific implementation step!

内容的提问来源于stack exchange,提问作者Luis Abreu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:06:39