android - Kotlin - 在活动重启时保留 RecyclerView 位置
问题描述
RecyclerView
重新启动后如何保留a的位置Activity
?我考虑过使用类似的东西,savedInstanceState
但如果不使用数十行代码,似乎并不容易做到这一点。
活动
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.md)
if (savedInstanceState == null) supportFragmentManager.beginTransaction()
.replace(R.id.master_container, MyFragment())
.commit()
}
}
分段
class MyFragment : androidx.fragment.app.Fragment() {
private lateinit var mRecyclerView: RecyclerView
private var myAdapter: AdapterMain? = null
private val myList = ArrayList<RVItem>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setHasOptionsMenu(true)
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val view = inflater.inflate(R.layout.activity_main, container, false)
myRecyclerView = view.myRecyclerView
myList.add(RVItem("Item A"))
myList.add(RVItem("Item B"))
myList.add(RVItem("Item C"))
...
myList.add(RVItem("Item Y"))
myList.add(RVItem("Item Z"))
myAdapter = AdapterMain(activity!!, myList)
myRecyclerView.adapter = mAdapter
return view
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
val mInflater = Objects.requireNonNull<androidx.fragment.app.FragmentActivity>(activity).menuInflater
mInflater.inflate(R.menu.main, menu)
super.onCreateOptionsMenu(menu, inflater)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when (item.itemId) {
R.id.action_restart -> {
restartActivity()
true
}
else -> super.onOptionsItemSelected(item)
}
}
private fun restartActivity() {
startActivity(
Intent(view!!.context, MainActivity::class.java)
)
activity!!.overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out)
activity!!.finish()
}
}
解决方案
RecyclerView
通过实现视图保存状态本机恢复滚动位置,并且您不需要额外的代码。
你做错的是“重新开始”你的活动。通过调用start
,finish
您正在破坏当前活动并创建新实例。它永远不会收到savedInstanceState
,因为它不是同一个活动。
相反,您应该使用activity.recreate()
正确地重新创建活动实例。它将接收savedInstanceState
并隐式恢复视图状态,包括RecyclerView
滚动。
推荐阅读
- kubernetes - Kubernetes-Pod:访问问题
- python - 在 TensorFlow 中分配 GPU 和 CPU 资源的最佳实践
- c# - 读取包含所有空格和缩进的原始 JSON 字符串的一部分
- mysql - 如何在mysql中运行子查询
- r - 更改高于特定值的线条颜色
- html - 以俄语字母/数字显示有序列表
- angular - 如何确定屏幕上是否正在显示动态组件并在 Angular8 中访问其属性
- python - 将一个列表上的值归因于另一个列表
- go - 我是否以有用的方式在 Go 中进行执行时间测量?
- docker - 运行私有 Docker 存储库时,是否可以与本地 docker 守护进程共享图像