使用导航组件保存RecyclerView的滚动

时间:2019-12-21 06:09:36

标签: android kotlin android-recyclerview

我在我的应用程序中将导航组件与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恢复到正确位置的最佳方法是什么?

3 个答案:

答案 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