Save state in Android

273 Views Asked by At

I'm currently writing an app that displays a list of movies using a recyclerview. I have a bottom navigation bar(trending, search and favorites) with several fragments. I'm trying to save the state of each fragment(the checkbox in it, its position, etc) but it's not working

Below is my viewmodel. I'm retrieving several list of movies(trending movies, action movies, etc) as you can see I'm trying to save the state of trending movies but it's not working and I don't know why.

Any help is appreciated. Thank you!

MoviesListViewModel.kt

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 val state: SavedStateHandle
): ViewModel() {

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

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

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

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

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

    private val _moviesTrending: MutableLiveData<List<MoviesResults.Movies>> = state.getLiveData(MOVIES_TRENDING, arrayListOf())
    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()
        }

    }

    fun saveTrendingMovie(moviesTrending: List<MoviesResults.Movies>) {
        state.set(MOVIES_TRENDING, moviesTrending)

    }

    fun getTrendingMovies(): List<MoviesResults.Movies> {
        return state.get(MOVIES_TRENDING) ?: emptyList()

    }















    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

            }

        }

    }

    companion object {
        private val MOVIES_TRENDING="moviesTrending"

    }



    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")

        }


    }



}





0

There are 0 best solutions below