首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用savestate保存回收视图项目

使用savestate保存回收视图项目
EN

Stack Overflow用户
提问于 2021-08-27 09:15:07
回答 1查看 66关注 0票数 1

我目前正在编写一个显示电影列表的应用程序。该应用程序有8个片段,其中包含回收视图:热门电影、动作、喜剧、恐怖、浪漫、科幻、搜索和收藏。

回收器视图中的项目包含一个将电影添加到收藏夹的复选框。当我滚动或退出应用程序时,复选框状态会重置。我正在尝试使用savestate保存复选框的状态,但它不起作用。

有人能告诉我我哪里做错了吗?下面是视图模型。

谢谢。

MoviesListViewModel.kt

代码语言:javascript
复制
package com.example.moviesapp.ui

import androidx.lifecycle.*
import com.example.moviesapp.network.MoviesRepository
import com.example.moviesapp.network.MoviesResults
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.launch
import javax.inject.Inject

const val DEFAULT_QUERY = " "
const val ACTION_MOVIES = "moviesAction"
const val COMEDY_MOVIES = "moviesComedy"
const val HORROR_MOVIES = "moviesHorror"
const val ROMANCE_MOVIES = "moviesRomance"
const val SCIFI_MOVIES = "moviesScifi"
const val TRENDING_MOVIES = "moviesTrending"


enum class MovieApiStatus {LOADING, ERROR, DONE}


@HiltViewModel
class MoviesListViewModel @Inject constructor(
    private val repository: MoviesRepository,
  private var state: SavedStateHandle

): ViewModel() {

       private val _moviesAction: MutableLiveData<List<MoviesResults.Movies>> = state.getLiveData(ACTION_MOVIES)
       val moviesAction: LiveData<List<MoviesResults.Movies>> = _moviesAction

       private val _moviesComedy: MutableLiveData<List<MoviesResults.Movies>> = state.getLiveData(COMEDY_MOVIES)
       val moviesComedy: LiveData<List<MoviesResults.Movies>> = _moviesComedy

       private val _moviesHorror: MutableLiveData<List<MoviesResults.Movies>> = state.getLiveData(HORROR_MOVIES)
       val moviesHorror: LiveData<List<MoviesResults.Movies>> = _moviesHorror

       private val _moviesRomance: MutableLiveData<List<MoviesResults.Movies>> = state.getLiveData(
           ROMANCE_MOVIES)
       val moviesRomance: LiveData<List<MoviesResults.Movies>> = _moviesRomance

       private val _moviesScifi: MutableLiveData<List<MoviesResults.Movies>> = state.getLiveData(SCIFI_MOVIES)
       val moviesScifi: LiveData<List<MoviesResults.Movies>> = _moviesScifi

    private val _moviesTrending: MutableLiveData<List<MoviesResults.Movies>> = state.getLiveData(TRENDING_MOVIES)
    val moviesTrending: LiveData<List<MoviesResults.Movies>> = _moviesTrending

    private val _networkState = MutableLiveData<MovieApiStatus>()
    val networkState: LiveData<MovieApiStatus> = _networkState





    init {
        getMovies()

    }




 fun getAction() {
     viewModelScope.launch {
         _moviesAction.value = repository.getActionMovies()
     }
 }

     fun getComedy() {
         viewModelScope.launch {
             _moviesComedy.value = repository.getComedyMovies()

         }

     }

    fun getHorror() {
        viewModelScope.launch {
            _moviesHorror.value = repository.getHorrorMovies()
        }

    }
    fun getRomance() {
        viewModelScope.launch {
            _moviesRomance.value = repository.getRomanceMovies()
        }

    }

    fun getScifi() {
        viewModelScope.launch {
            _moviesScifi.value = repository.getScifiMovies()

        }

    }

    fun getTrending() {
        viewModelScope.launch {
            _moviesTrending.value = repository.getTrendingMovies()
        }

    }









    private var currentQuery = MutableLiveData(DEFAULT_QUERY)







     val movies = currentQuery.switchMap {
            queryString ->
       liveData {
           emit(repository.getSearchResults(queryString))
       }
   }

    fun searchMovies(query: String) {

    currentQuery.value = query

    }

    private fun getMovies() {
        viewModelScope. launch {
            _networkState.value = MovieApiStatus.LOADING
            try {
                _networkState.value = MovieApiStatus.DONE
            }
            catch (e: Exception) {
                _networkState.value = MovieApiStatus.ERROR

            }

        }

    }



    class MoviesListViewModelFactory @Inject constructor(private val repository: MoviesRepository, private val state: SavedStateHandle): ViewModelProvider.Factory {
        override fun <T : ViewModel?> create(modelClass: Class<T>): T {
            if (modelClass.isAssignableFrom(MoviesListViewModel::class.java)) {
                @Suppress("UNCHECKED_CAST")
                return MoviesListViewModel(repository, state) as T
            }
            throw IllegalArgumentException("Unknown ViewModel class")

        }


    }



}
EN

回答 1

Stack Overflow用户

发布于 2021-08-27 10:21:29

用于访问和修改由Context.getSharedPreferences(String,返回的首选项数据的接口( int)。对于任何特定的首选项集,都有一个所有客户端共享的类的单个实例。对首选项的修改必须通过Editor对象,以确保首选项值保持一致状态,并控制它们何时提交到存储。应用程序必须将从各种get方法返回的对象视为不可变对象。

注意:这个类提供了很强的一致性保证。它正在使用昂贵的操作,这可能会减慢应用程序的速度。经常更改属性或可以容忍损失的属性应该使用其他机制。有关更多详细信息,请阅读Editor.commit()Editor.apply().上的评论

注意:这个类不支持跨多个进程使用。

在您的例子中,您可以简单地存储键-值对来记录相关的选择。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68950924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档