nRestoreInstanceState不适用于Recycle

nRestoreInstanceState不适用于Recycle

本文介绍了如果使用Paging 3库,则onRestoreInstanceState不适用于RecyclerView布局管理器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在保存RecyclerView状态时遇到问题,它通过保存布局管理器状态并在恢复片段后使用它来解决.(感谢@HarisDautović)

I had a problem in saving RecyclerView state and it solved by saving layout manager state and using it after resume fragment.(thanks to @HarisDautović)

class TestFragment : Fragment() {

    private val testListAdapter: TestListAdapter by lazy {
        TestListAdapter()
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.fragment_test, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)


        postListView.apply {
            layoutManager = StaggeredGridLayoutManager(
                2, StaggeredGridLayoutManager.VERTICAL
            ).apply {
                gapStrategy = StaggeredGridLayoutManager.GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS
            }
            setHasFixedSize(true)

            adapter = testListAdapter
        }
    }

    private var layoutManagerState: Parcelable? = null

    override fun onPause() {
        saveLayoutManagerState()
        super.onPause()
    }

    override fun onViewStateRestored(savedInstanceState: Bundle?) {
        super.onViewStateRestored(savedInstanceState)
        restoreLayoutManagerState()
    }

    private fun restoreLayoutManagerState () {
        layoutManagerState?.let { postListView.layoutManager?.onRestoreInstanceState(it) }
    }

    private fun saveLayoutManagerState () {
        layoutManagerState = postListView.layoutManager?.onSaveInstanceState()
    }

}

,但是如果使用分页3库,则它不起作用.只是导入此库会导致问题,即使不在应用程序中使用它也是如此.

but if using paging 3 library it does not work. just importing this library causes problem even not using it in app.

请查看此问题和接受的答案的评论以获取更多详细信息:在ViewPager中带有StaggeredGridLayoutManager的RecyclerView,当返回片段时会自动排列项目

please see this question and accepted answer's comments for more details:RecyclerView with StaggeredGridLayoutManager in ViewPager, arranges items automatically when going back to fragment

推荐答案

更新:

我的问题通过使用解决:

my problem solved by using:

testListAdapter.stateRestorationPolicy = RecyclerView.Adapter.StateRestorationPolicy.PREVENT

和自定义恢复逻辑

旧答案:问题出在Recyclervew.使用较新的alpha版本的recyclerView的分页库存在此问题.通过导入分页,整个项目都使用此版本的recyclerview.强制使用稳定版的RecyclerView解决了该问题.

OLD ANSWER:problem is from Recyclervew. the paging library using a newer alpha version of recyclerView that have this problem. by importing paging, whole project using this version of recyclerview. forcing to use stable version of RecyclerView solve the problem.

在build.gradle中:

in build.gradle:

android {

    ...

    configurations.all {
        resolutionStrategy.eachDependency { details ->
            if (details.requested.group == 'androidx.recyclerview') {
                details.useVersion "1.1.0"
            }
        }
    }
}

这篇关于如果使用Paging 3库,则onRestoreInstanceState不适用于RecyclerView布局管理器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-21 09:26