我有一个回收器视图,它在片段中使用分页3.当它的一个项目被点击时,我需要显示一个底部的工作表与完全相同的回收器视图在一个更精细的方式. 我想try 并重用相同的回收器视图适配器,这样就不会不必要地调用更多的API调用(我已经在父片段中拥有了来自回收器视图的所有必需数据)

这就是我实现父级碎片回收器视图的方式

        cardsRcView = binding.myCardsRcv.apply {
            // use this setting to improve performance if you know that changes
            // in content do not change the layout size of the RecyclerView
            setHasFixedSize(true)

            // use a linear layout manager
            layoutManager = CenterZoomLinearLayoutManager(context)

            // specify an viewAdapter (see also next example)
            adapter = cardsAdapter
        }
        cardsAdapter.apply {
            onClickCard = {
                val cardSheet = DetailsBottomSheet.newInstance(cardsAdapter,cardPos)
                cardSheet.show(childFragmentManager, "Card Details")
            }
        }

视图模型:

fun fetchCards(
        orgId: String
    ): Flow<PagingData<UIModel>> {
        val pageSize = 5
        return Pager(
            config = PagingConfig(
                pageSize = pageSize,
                enablePlaceholders = false,
                initialLoadSize = pageSize
            ),
            pagingSourceFactory = {
                CardsPagingDataSource(
                    orgId = orgId,
                    getCardsUseCase = getCardsUseCase
                )
            }
        ).flow
}

在下面这样的底纸上:

companion object {
        fun newInstance(
            cardsAdapter: CardsAdapter,
            cardPos: Int
        ): CardDetailsBottomSheet {
            val cardBottomSheet = CardDetailsBottomSheet()
            cardBottomSheet.cardsAdapter = cardsAdapter
            cardBottomSheet.cardPos = cardPos
            return cardBottomSheet
        }
    }

    private var cardsAdapter: CardsAdapter? = null
....
cardsRcView.apply {
            // use this setting to improve performance if you know that changes
            // in content do not change the layout size of the RecyclerView
            setHasFixedSize(true)

            // use a linear layout manager
            layoutManager = CenterZoomLinearLayoutManager(context)

            // specify an viewAdapter (see also next example)
            adapter = cardsAdapter
        }
        // This will affect my parent fragment adapter. I don't want it to.
        cardsAdapter?.apply {
            onClickCard = null
        }

我如何才能在不进行不必要的API调用的情况下做到这一点?

我想过获取分页适配器.snapShot()并在底页内创建一个新的适配器,但接下来如何将分页集成到底页内的回收器视图中.

推荐答案

按照这样的 idea ,这是因为每次调用fetchCards方法时都创建一个新的Pager实例.下面是一个重复使用pager 的例子:

private val pagersMap = hashMapOf<String, Pager<String, UIModel>>()

fun fetchCards(orgId: String): Flow<PagingData<UIModel>> {
    val pager: Pager<String, UIModel> = pagersMap[orgId] ?: createPager(orgId)
    return pager.flow
}

private fun createPager(orgId: String): Pager<String, UIModel> {
    val pager = Pager(
        config = PagingConfig(
            pageSize = 5,
            enablePlaceholders = false,
            initialLoadSize = 5
        ),
        pagingSourceFactory = {
            CardsPagingDataSource(orgId)
        }
    )
    pagersMap[orgId] = pager
    return pager
}

但您必须使用您的数据类型等进行测试.

记住在两个片段中使用相同的ViewModel实例.我不知道如何实例化ViewModel,但您可以通过将它的作用域限定为活动或父Fargmenet(取决于您的应用程序 struct )来实现-更多细节here.

如果你做不到,也许你应该创建一些储存库,然后从那里取出pager .

Android相关问答推荐

致命异常:java.lang. SecureExcellent::用户10021和当前进程都没有android. permissions.Change_WIFI_STATE

这款应用与最新版本的Android不兼容.在Android 14中

在 Bash 脚本中使用 XMLLINT 解析 XML 单元测试文件,并将其放入数组中以表示成功和失败

为什么我收到这个错误我需要安装 android studio

如何在 Jetpack Compose 中对数据类进行 Parcelize

以下代码如何在 Android 上运行

CoroutineScope 与挂起函数

Android:ActivityCompat.requestPermissions 不显示弹窗(Android 13,targetSdkVersion=33)

Jetpack Compose UI - 在 AlertDialog 中单击时按钮宽度会发生变化

我该怎么做文本计时器

Composable 不会在单击按钮时重新组合

如何在 Android Jetpack compose 中为列表初始填充设置动画

如何在 Jetpack Compose 中的 VisualTransformation 之后将光标保持在文本字段的末尾

错误:构建 react-native 应用程序时包 com.facebook.react.bridge 不存在

Jetpack compose 未解决的参考错误

新的内部测试应用程序版本不适用于测试人员,即使它说它们是

TextField 溢出和软包装不适用于 Compose 约束布局

关于launchWhenX和repeatOnLifecycle的问题

在delphi中将Jnet_uri转换为Tbitmap

如何使 BasicTextField 上的光标以 jetpack compose 为中心?