我的回收视图在滚动时丢失数据

问题描述

我有一个相当复杂的 RecyclerView,其中有 9 个单独的视图,其中两个具有嵌套的 Recycler 视图。问题是 RecyclerView 在滚动时没有回收项目,所以看起来 RecyclerView 丢失了数据。但是,如果我等几分钟,这些项目就会再次滚动。我试着做:

recyclerView.recycledViewPool.setMaxRecycledViews(0,0);

holder.setIsRecyclable(false)

我尝试了一些使用 onScrollListener 的蛮力解决方案,一旦使用滚动到底部,它会强制回收器视图再次绘制自己,但这会导致滚动移动。

这是包含 RecyclerView 的片段中的一些代码:

    private fun setUpObservableForTiles() {
    homeDashboardViewModel.listOfRegisteredListDashBoardViews.observe(viewLifecycleOwner,Observer {
        it ?: return@Observer

        val list = arrayListOf<HomeDashBoardItem>()

        it.forEach { dashboardType ->
            when (dashboardType) {
                DashBoardType.CHECKING_ACCOUNT -> {
                    val checkingAccountItem = AccountItem(
                            homeDashboardViewModel.last4Pan,homeDashboardViewModel.expandRecyclerView,balanceViewModel.balanceInfo,balanceViewModel.getBalanceResult,transactionViewModel.recentMutableList,homeDashboardViewModel.successfulTransactions,directDepositViewModel.accountDetailsResponse,overdraftViewModel.isODAccount,theme,dashboardType.sortOrder,dashboardType)
                    list.add(checkingAccountItem)
                }
                DashBoardType.OVERDRAFT_PROTECTION -> {
                    val overdraftProtectionItem = OverdraftProtectionItem(
                            theme,dashboardType)
                    list.add(overdraftProtectionItem)
                }
                DashBoardType.ATM_LOCATIONS -> {
                    val atmLocationItem = HomeDashBoardItem(
                            theme,dashboardType)
                    list.add(atmLocationItem)
                }
                DashBoardType.DIRECT_DEPOSIT -> {
                    directDepositItem.apply { this.sort = dashboardType.sortOrder }
                    list.add(directDepositItem)
                }
                DashBoardType.SECURED_ACCOUNT -> {
                    FeatureControlManager.getInstance()?.featureControl?.observe(viewLifecycleOwner,Observer { ddaFeatureControl ->
                        val secureCardItem = SecureCardItem(
                                ddaFeatureControl,trackCardViewModel.loading,trackCardViewModel.trackInfoResponse,trackCardViewModel.trackErrorResponseLiveData,dashboardType)
                        list.add(secureCardItem)
                        submitListToAdapter(list)
                    })
                }
                DashBoardType.SECURED_CREDIT_CARD_ACCOUNT -> {
                    if (::securedCardViewModel.isInitialized) {
                        val secureCardItem = SecuredCreditCardItem(
                                false,securedCardViewModel.securedCardInfo,securedCardTransactionViewModel.allMutableList,securedCardTransactionViewModel.loading,dashboardType,securedCardViewModel,securedCardTransactionViewModel)
                        isPromoSCC=false
                        list.add(secureCardItem)
                    }
                }
                DashBoardType.SECURED_CREDIT_CARD_PROMO_ACCOUNT -> {
                    if (::securedCardViewModel.isInitialized) {
                        val secureCardItem = SecuredCreditCardItem(
                                false,securedCardTransactionViewModel)
                        isPromoSCC=true
                        list.add(secureCardItem)
                    }
                }
                DashBoardType.REWARDS -> {
                    val rewardsItem = RewardsItem(
                            theme,dashboardType)
                    list.add(rewardsItem)
                }
                DashBoardType.SAVINGS_ACCOUNT,DashBoardType.SAVINGS_ACCOUNT_PROMO -> {
                    val vaultItem = VaultItem(
                            vaultViewModel.vaultsApiCallStatus,vaultViewModel.vaultResponse,dashboardType
                    )
                    list.add(vaultItem)
                }
                else -> return@Observer
            }
        }
        submitListToAdapter(list)

    })
}

private fun submitListToAdapter(list: ArrayList<HomeDashBoardItem>) {
    list.sortWith { o1,o2 -> (o1.sort).compareTo(o2.sort) }
    listDashboardAdapter.submitList(list.distinct())
    val scrollPosition = SharedPreferencesManager.getCurrentState().scrollPositionForDashboard
    Handler().postDelayed(Runnable { (binding.recyclerView.layoutManager as LinearLayoutManager).scrollToPositionWithOffset(scrollPosition,0) },200)

}

注意:这仅在 ViewHolders 之一中的嵌套 RecyclerView 可见时发生。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)