0

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

当我搜索电影时,一切正常,但是当我改变方向时,活动就失去了它的状态。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
    }


}

这是视图模型:

class MainViewModel : ViewModel(){

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

}

这是主活动:

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
    }


}
4

1 回答 1

1

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

var persistedMovies = arrayListOf<Movie>()

当搜索返回有效响应时,

mainViewModel.persistedMovies = newList

现在列表的范围是视图模型,并通过方向变化保持不变。

于 2021-12-20T03:27:23.327 回答