使用导航组件保存回收器视图的滚动



我正在我的应用程序中使用带有底部导航视图的导航组件。它在 4 个目的地之间切换,其中一个目的地包含一个片段,其中回收器视图包含数百个项目。当我使用后退按钮时,回收器视图会恢复到以前的滚动位置。但是当我使用底部导航视图在目的地之间切换时,它不会恢复到之前的位置并重置到回收器视图的顶部。这是我试图阻止的代码

override fun onPause() {
super.onPause()
lastScrollPos = linearLayoutManager.findFirstVisibleItemPosition()
}
override fun onResume() {
super.onResume()
card_recyclerView.layoutManager?.scrollToPosition(lastScrollPos)
}

这不是工作,将回收器视图恢复到正确位置的最佳方法是什么?

它没有滚动到上一个位置的原因是navController在与bottomNavigation一起使用时重新创建片段(使用替换(。

保存滚动状态的一种简单方法是将layoutManager状态存储在onDestroyView中并将其还原到onCreateView与scrollToPosition不同,此方法将在NavController重新创建片段时滚动到确切位置

我在另一个线程中发布了完整的代码 https://stackoverflow.com/a/66940957/2102794

这可以通过将ScrollView的 Y 轴位置保存在成员变量中并在onCreateView()中恢复来完成。这是有效的,因为成员变量不会被销毁。

class DiscoverDataFragment : BaseFragment() {
private var loaded = false
private var scrollPos = 0

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

override fun onCreateBind() {
super.onCreateBind()  
if (!loaded) {
// Load views here
loaded = true
}

if (scrollPos > 0) {
scrollDiscoverData.scrollY = scrollPos
}

setScrollListener()
}

private fun setScrollListener() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
scrollDiscoverData.setOnScrollChangeListener { v, scrollX, scrollY, oldScrollX, oldScrollY ->
scrollPos = scrollY
}
}
}

您必须在片段生命周期之外初始化适配器,例如

class MyFragment : Fragment() {
private val myViewModel by viewModel<MyViewModel>()
private lateinit var myAdapter : MyAdapter
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
myAdapter = MyAdapter()
Log.d("checkListData", myAdapter.currentList.toString())
myViewModel.someListData.observe(viewLifecycleOwner){ listData ->
myAdapter.submitList(listData)
}
}}

最新更新