在 stackoverflow ( link ) 上找到了一种保存 RecyclerView 状态的方法。保存发生,但屏幕旋转后没有恢复。
在gif的最后可以看到,在旋转之后,我调用了数据加载方法,调用了RecyclerView方法来更新列表。如果我不这样做,我会得到一个白屏。
以前,我做的不一样。保存数组和滚动位置。
class BookmarkActivity : AppCompatActivity(), ViewBookmark{
private lateinit var viewAdapter: RecyclerView.Adapter<RecyclerView.ViewHolder>
private lateinit var viewManager: RecyclerView.LayoutManager
private lateinit var recyclerView: RecyclerView
private val presenter : PresenterBookmark
private val arrayList: ArrayList<BookmarkList>
private lateinit var progressBar : ProgressBar
companion object {
val TAG = "BookmarkActivity"
val LIST_STATE_KEY = "bookmark_list"
}
init {
arrayList = ArrayList()
presenter = PresenterImpl(this)
}
override fun onCreate(@Nullable savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_bookmark)
progressBar = findViewById(R.id.progressBarBookmark)
recyclerView = findViewById<RecyclerView>(R.id.rv_bookmark)
viewManager = LinearLayoutManager(this)
viewAdapter = BookmarkAdapter(this)
recyclerView.apply {
layoutManager = viewManager
adapter = viewAdapter
}
if(savedInstanceState == null){
presenter.getData()
removeList()
}
}
override fun getRepositoriesRowsCount(): Int = presenter.getSizeData()
override fun currentListPosition(position: Int): Int = presenter.setCurrentListPosition(position)
override fun getItemViewHolder(rowView: ItemViewHolder, position: Int) = presenter.setItemViewHolder(rowView, position)
override fun progressBarGone() {
progressBar.visibility = View.GONE
}
override fun removeList() {
recyclerView.adapter.notifyDataSetChanged()
}
override fun stopScroll() {
recyclerView.stopScroll()
}
public override fun onSaveInstanceState(outState: Bundle?) {
super.onSaveInstanceState(outState)
Log.d("onSaveInstanceState", "Save -----")
outState!!.putParcelable(LIST_STATE_KEY, recyclerView.getLayoutManager().onSaveInstanceState());
}
override fun onRestoreInstanceState(savedInstanceState: Bundle?) {
super.onRestoreInstanceState(savedInstanceState)
if (savedInstanceState != null) {
Log.d("onRestoreInstanceState", "Restore YES-----")
val savedRecyclerLayoutState : Parcelable = savedInstanceState.getParcelable(LIST_STATE_KEY)
recyclerView.layoutManager.onRestoreInstanceState(savedRecyclerLayoutState)
progressBarGone()
presenter.getData() // ЗАГРУЖАЮ ДАННЫЕ СНОВА
removeList() //ВЫЗЫВАЮ recyclerView.adapter.notifyDataSetChanged()
}
}
}

通常 onCreate 中的顺序应该是这样的:
那些。现在您在演示者中缓存了数据(他已经决定缓存或从模型中获取新数据)
如果您也在为这个问题而苦苦挣扎,这是我的解决方案。
感谢昵称 Serge Markov 对用户的帮助。