如何使 RecyclerView 与 Composable ViewHolder 渲染更快?

Posted

技术标签:

【中文标题】如何使 RecyclerView 与 Composable ViewHolder 渲染更快?【英文标题】:How to make RecyclerView with Composable ViewHolder render faster? 【发布时间】:2021-11-29 11:59:19 【问题描述】:

根据https://developer.android.com/jetpack/compose/interop/compose-in-existing-ui#compose-recyclerview,可以在RecyclerView中使用的可组合ViewHolder如下

import androidx.compose.ui.platform.ViewCompositionStrategy

class MyComposeViewHolder(
    val composeView: ComposeView
) : RecyclerView.ViewHolder(composeView) 

    init 
        composeView.setViewCompositionStrategy(
            ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed
        )
    

    fun bind(input: String) 
        composeView.setContent 
            MdcTheme 
                Text(input)
            
        
    

看起来,每次都是bind 可组合的setContent(即再次重绘)。

我用Profile GPU Rendering测量速度,很明显ReyclerView+ComposeViewHolder的Hybrid比纯RecyclerView或LazyColumn慢。

您可以获取design here

我们怎样才能加速Hybrid RecyclerView+ComposeViewHolder?

【问题讨论】:

【参考方案1】:

请在启用 R8 的情况下运行应用程序的发布版本。这会显着提高性能。

【讨论】:

我已经 minifyEnabled true ,看到app:minifyDebugWithR8 触发了。所以我相信 R8 已启用。结果是一样的,对Hybrid版本没有任何改进。 它是调试版本还是发布版本?【参考方案2】:

尝试使用与片段/活动的生命周期相关的差异视图组合策略。这样,您的可组合项就不会基于经常发生的视图的附加/分离

【讨论】:

以上是关于如何使 RecyclerView 与 Composable ViewHolder 渲染更快?的主要内容,如果未能解决你的问题,请参考以下文章

如何使工具栏与片段中的内容一起滚动?

怎样才能使Android RecyclerView透明吗

如何使 Recyclerview 和 Cardview 透明

如何使 RecyclerView 处理 onclicklistener [重复]

recyclerview图像捕捉与大图像中间

RecyclerView使用介绍