簡體   English   中英

如何在片段中維護滾動 position?

[英]How can I maintain scroll position in a fragment?

我正在嘗試將滾動 position 保存在片段中。 流量->

  1. 片段 A - 滾動到一些 position
  2. 片段 B
  3. 回到片段 A 到相同的 position,而不是從頂部創建所有內容。

我的嘗試

嘗試 1

private var index: Int = -1
private var top = -1
private var lastFirstVisiblePosition : Int? = null
override fun onPause() {
    super.onPause()
    index = linearLayoutManager.findFirstVisibleItemPosition()
    val v: View = homeRecyclerView!!.getChildAt(0)
    top = v.top - homeRecyclerView!!.paddingTop

    val preferences =  PreferenceManager.getDefaultSharedPreferences(context)
    preferences.edit()
        .putInt("position", index)
        .putInt("offset", top)
        .apply();

}

override fun onResume() {
    super.onResume()
    val preferences =  PreferenceManager.getDefaultSharedPreferences(context)

    index = preferences.getInt("position",0)
    top = preferences.getInt("offset",0)

    if(this.index != -1)
    {
        (homeRecyclerView!!.layoutManager as LinearLayoutManager)
            .scrollToPositionWithOffset(index,top)
    }
}

結果:不滾動。 代碼到達行(homeRecyclerView..,layoutManager as LinearLayoutManager).scrollToPositionWithOffset(index,top)但不滾動

嘗試 2

    private val BUNDLE_RECYCLER_LAYOUT = "classname.recycler.layout"

override fun onViewStateRestored(savedInstanceState: Bundle?) {
    super.onViewStateRestored(savedInstanceState)
    if (savedInstanceState != null)
    {
        val savedRecyclerLayoutState: Parcelable? =
            savedInstanceState.getParcelable(BUNDLE_RECYCLER_LAYOUT)
        homeRecyclerView!!.layoutManager!!.onRestoreInstanceState(savedRecyclerLayoutState)
    }
}

override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState)
    outState.putParcelable(BUNDLE_RECYCLER_LAYOUT, homeRecyclerView!!.layoutManager!!.onSaveInstanceState());
}

結果:沒有錯誤但不滾動

嘗試 3

    override fun onPause() {
    super.onPause()
    state = linearLayoutManager.onSaveInstanceState()
}

我對Parcelable有所了解,但我不知道如何實現它

我的家庭片段:

class HomeFragment : Fragment() {



private var homePostAdapter: HomePostAdapter? = null
private var postList: MutableList<HomePostModel>? = null
val linearLayoutManager = LinearLayoutManager(context)
var homeRecyclerView: RecyclerView? = null

private var userFollowingList: MutableList<HomePostModel>? = null
override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {

    // Inflate the layout for this fragment
    val view = inflater.inflate(R.layout.fragment_home, container, false)



    homeRecyclerView = view.findViewById<RecyclerView>(R.id.recycler_view_home)

    linearLayoutManager.reverseLayout = true
    linearLayoutManager.stackFromEnd = true

    homeRecyclerView!!.layoutManager = linearLayoutManager

    postList = ArrayList()
    homePostAdapter =
        context?.let { HomePostAdapter(it, postList as ArrayList<HomePostModel>, true) }
    homeRecyclerView!!.adapter = homePostAdapter


    homeRecyclerView!!.setHasFixedSize(true)

    homeRecyclerView!!.setItemViewCacheSize(20)

    return view


}

返回此片段時,我想獲取用戶所在的滾動 position。 現在,它從頂部加載。 我的嘗試沒有錯誤,因此我不明白出了什么問題。 感謝您的幫助。

更新

問題是我沒有使用Holder().postDelayed有一點延遲。 現在工作正常。

但是,有人可以告訴我檢索卷軸的確切position 的正確方法嗎? 現在我的嘗試 1 正在工作,但滾動是跳躍而不准確的。

更新 2

我找到了dy position 並使用它滾動到最后一個 state。 見答案。 如果有人有更好的方法,請告訴我。

在 onCreateView 中,我找到了dy ,基於此,我找到了滾動條 position。 由於dy僅在smoothScroll中可用,我在onResume上使用它來返回 position。

在片段/活動內部:

homeRecyclerView!!.addOnScrollListener(object : RecyclerView.OnScrollListener() {

        override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
            super.onScrolled(recyclerView, dx, dy)
            scrolled += dy

            val preferences = PreferenceManager.getDefaultSharedPreferences(context)
            preferences.edit()
                .putInt("position", scrolled)
                .apply()

        }
    })

簡歷:

 override fun onResume() {
    super.onResume()
    val preferences = PreferenceManager.getDefaultSharedPreferences(context)

    val index = preferences.getInt("position", 0)

        homeRecyclerView!!.smoothScrollBy(0, index)
    }, 50)

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM