Kotlin - сохранение позиции RecyclerView при перезапуске активности - PullRequest
0 голосов
/ 27 марта 2020

Как можно сохранить положение RecyclerView после перезапуска 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()
    }
}

1 Ответ

0 голосов
/ 27 марта 2020

RecyclerView восстанавливает исходную позицию прокрутки путем реализации состояния сохранения вида и не требует дополнительного кода с вашей стороны.

То, что вы делаете неправильно, это «перезапуск» вашей деятельности. Вызывая start и finish, вы уничтожаете текущую активность и создаете новый экземпляр. Он никогда не получит savedInstanceState, потому что это не одно и то же действие.

Вместо этого вы должны использовать activity.recreate() для правильного воссоздания экземпляра действия. Он получит savedInstanceState и неявно восстановит состояние просмотра, включая прокрутку RecyclerView.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...