android - 如何在片段android kotlin中保存RecyclerView状态
问题描述
我有两个片段,其中一个包含 RecyclerView(数据来自 Firebase)。比如用户点击一个item,打开一个带有描述的fragment,然后如果返回需要保存RecyclerView的滚动状态。我尝试使用onScrollStateChanged()
with SharedPreferences
,但未保存状态。
我的代码:
private lateinit var binding: FragmentListBinding
private lateinit var rvAdapter: RvStatesAdapter
private var statesList = ArrayList<State>()
private var databaseReferenceStates: DatabaseReference? = null
private lateinit var sharedPreferences: SharedPreferences
private var lastPosition by Delegates.notNull<Int>()
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
binding = FragmentListBinding.inflate(inflater, container, false)
initDatabase()
getStates()
binding.rvStates.layoutManager = LinearLayoutManager(requireContext())
binding.rvStates.addOnScrollListener(object: RecyclerView.OnScrollListener() {
override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
super.onScrollStateChanged(recyclerView, newState)
lastPosition = (recyclerView.layoutManager as LinearLayoutManager?)!!.findFirstVisibleItemPosition()
}
})
return binding.root
}
override fun onResume() {
super.onResume()
getLastPositionFromRecyclerView()
}
private fun getLastPositionFromRecyclerView() {
val statePrefs: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(requireContext())
lastPosition = statePrefs.getInt("lastPosition", 0)
(binding.rvStates.layoutManager as LinearLayoutManager?)!!.scrollToPosition(lastPosition)
}
override fun onPause() {
super.onPause()
saveStateOfRecyclerView()
}
private fun saveStateOfRecyclerView() {
val statePrefs: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(requireContext())
val editor: SharedPreferences.Editor = statePrefs.edit()
editor.putInt("lastPosition", lastPosition)
editor.apply()
}
private fun getStates() {
databaseReferenceStates?.addValueEventListener(object: ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
if (snapshot.exists()) {
for (stateSnapshot in snapshot.children) {
val state = stateSnapshot.getValue(State::class.java)
statesList.add(state!!)
}
rvAdapter = RvStatesAdapter(statesList)
binding.rvStates.adapter = rvAdapter
}
}
override fun onCancelled(error: DatabaseError) {
}
})
}
private fun initDatabase() {
FirebaseApp.initializeApp(requireContext());
databaseReferenceStates = FirebaseDatabase.getInstance().getReference("States")
}
}
解决方案
推荐阅读
- vb.net - Visual Studio 2019 社区中的属性事件
- python - Keras 图像分类损失
- c++ - 电话价格问题(十月挑战 Codechef)
- python - 是否有用于查找只有一些列是可变的行组合的python代码
- python - 如何将 Django 与基于 Python 的爬虫机连接起来?
- c - 在 gdb 中添加新符号
- python - 如何在忽略一级的情况下访问熊猫多索引中的对象
- javascript - 如何在 ReactJS 中调用 java 服务
- php - 根据动态选择填充选择字段
- youtube-api - 列出来自 Youtube API V3 的视频时未找到纵横比