我在我的应用程序中将导航组件与BottomNavigationView一起使用。它在4个目的地之间切换,其中一个目的地包含一个片段,而RecyclerView包含数百个项目。当我使用“后退”按钮时,RecyclerView会恢复到先前的滚动位置。但是,当我使用BottomNavigationView在目标之间切换时,它不会恢复到先前的位置,而是会重置到RecyclerView的顶部。这是我试图防止的代码
override fun onPause() {
super.onPause()
lastScrollPos = linearLayoutManager.findFirstVisibleItemPosition()
}
override fun onResume() {
super.onResume()
card_recyclerView.layoutManager?.scrollToPosition(lastScrollPos)
}
这不是可行的,将RecyclerView恢复到正确位置的最佳方法是什么?
答案 0 :(得分:0)
这可以通过将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
}
}
}
答案 1 :(得分:0)
例如,您必须在片段生命周期之外初始化适配器
class MyFragment : Fragment() {
private val myViewModel by viewModel<MyViewModel>()
private val myAdapter = MyAdapter()
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
Log.d("checkListData", myAdapter.currentList.toString())
myViewModel.someListData.observe(viewLifecycleOwner){ listData ->
myAdapter.submitList(listData)
}
}}
答案 2 :(得分:0)
它不滚动到前一个位置的原因是当与 navController
一起使用时,bottomNavigation
重新创建了片段(使用替换)。
保存滚动状态的一种简单方法是将 layoutManager
状态存储在 onDestroyView
中并在 onCreateView
上恢复它与 scrollToPosition 不同,这种方法将滚动到确切位置 当 NavController 重新创建片段时。
我在另一个帖子中发布了完整代码 https://stackoverflow.com/a/66940957/2102794