我正在我的应用程序中使用带有底部导航视图的导航组件。它在 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)
}
}}