onRestoreInstanceState не работает для диспетчера компоновки RecyclerView при использовании библиотеки Paging 3

У меня возникла проблема с сохранением состояния RecyclerView, и она была решена путем сохранения состояния диспетчера компоновки и использования его после фрагмента резюме. (Спасибо @ 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()
    }

}

но при использовании библиотеки paging 3 это не работает. просто импорт этой библиотеки вызывает проблему, даже если ее не использовать в приложении.

для получения дополнительных сведений см. этот вопрос и принятые комментарии к ответу: RecyclerView с StaggeredGridLayoutManager в ViewPager, автоматически упорядочивает элементы при возврате к фрагменту




Ответы (1)


ОБНОВЛЕНИЕ:

моя проблема решена с помощью:

testListAdapter.stateRestorationPolicy = RecyclerView.Adapter.StateRestorationPolicy.PREVENT

и настраиваемая логика восстановления

СТАРЫЙ ОТВЕТ: проблема от Recyclervew. библиотека подкачки с использованием более новой альфа-версии recyclerView, у которой есть эта проблема. путем импорта подкачки всего проекта, использующего эту версию recyclerview. принуждение к использованию стабильной версии RecyclerView решает проблему.

в build.gradle:

android {
    
    ...

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