配置更改不保存应用程序状态 MVVM

Configuration Changes Not Save App State MVVM

我正在构建一个电影应用程序。有一个与父尺寸匹配的回收视图,以及 1 个搜索操作按钮(SearchView)。

当我搜索电影时,一切正常,但是当我改变方向时,activity 就失去了它的状态。 recyclerview 变空了,我需要重新搜索电影。

我正在使用 MVVM,我知道它不会发生..

谢谢!

这是存储库:

class MainRepository {

   
    private val searchAfterMutableLiveData = MutableLiveData<List<Movie>>()
    private val apiService : GetFromApi = APIService.retrofitClientRequest
    private val apiKey = "censored"

    fun searchAfter(searchAfter : String) : MutableLiveData<List<Movie>>{

        apiService.searchAfter(apiKey,searchAfter)?.enqueue(object : Callback<MovieListResult?> {
            override fun onResponse(
                call: Call<MovieListResult?>,
                response: Response<MovieListResult?>
            ) {

                if (response.isSuccessful){
                    searchAfterMutableLiveData.value = response.body()?.moviesResults
                    Log.e("SearchMovieListResults","Result: ${searchAfterMutableLiveData.value}")
                }

            }

            override fun onFailure(call: Call<MovieListResult?>, t: Throwable) {
                Log.e("SearchMovieListResults","Failed: ${t.message}")
            }
        })

        return searchAfterMutableLiveData
    }


}

这是 ViewModel:

class MainViewModel : ViewModel(){

    fun getMovieBySearch(searchAfter : String) : LiveData<List<Movie>>{
        return mainRepository.searchAfter(searchAfter)
    }

}

这是 MainActivity:

class MainActivity : AppCompatActivity() {

    private val mainViewModel : MainViewModel by viewModels()
    private lateinit var mainRecyclerView : RecyclerView
    private lateinit var mainAdapter : MainRecyclerViewAdapter

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        initRecyclerView()

    }


    private fun initRecyclerView() {

        mainRecyclerView = findViewById(R.id.mainRecyclerView)
        mainRecyclerView.setHasFixedSize(true)
        mainRecyclerView.layoutManager = GridLayoutManager(this,1)

    }

    override fun onCreateOptionsMenu(menu: Menu): Boolean {
        menuInflater.inflate(R.menu.main_menu,menu)

        val searchView = menu.findItem(R.id.menu_search_movie).actionView as androidx.appcompat.widget.SearchView

        searchView.queryHint = "Search By Name,Actor .."
        searchView.setOnQueryTextListener(object : androidx.appcompat.widget.SearchView.OnQueryTextListener {
            override fun onQueryTextSubmit(whileTextChange: String?): Boolean {

                //Clear SearchView
                searchView.isIconified = true
                searchView.setQuery("", false)
                searchView.onActionViewCollapsed()
                mainViewModel.getMovieBySearch(whileTextChange.toString()).observe(this@MainActivity,object : Observer<List<Movie>?> {
                    override fun onChanged(newList: List<Movie>?) {
                        if (newList != null) {

                            mainAdapter = MainRecyclerViewAdapter(newList)
                            mainRecyclerView.adapter = mainAdapter
                            //mainAdapter.changeCurrentList(newList)

                        }
                    }
                })

                return false
            }

            override fun onQueryTextChange(whileTextChange: String?): Boolean {
                Log.e("onQueryTextChange","Text: $whileTextChange")
                return false
            }
        })



        return true
    }


}

您需要在视图模型中保存所需的状态。例如,

var persistedMovies = arrayListOf<Movie>()

并且当搜索 returns 有效响应时,

mainViewModel.persistedMovies = newList

现在列表范围到视图模型,并通过方向变化持续存在。