[英]How can I maintain scroll position in a fragment?
我正在嘗試將滾動 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.