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

Amo*_*kar 5 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)
}
Run Code Online (Sandbox Code Playgroud)

这不起作用将 RecyclerView 恢复到正确位置的最佳方法是什么?

小智 0

这可以通过将 的 Y 轴位置保存ScrollView在成员变量中并将其恢复到 中来完成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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)