ViewModel / LiveData / Observer设计

问题描述 投票:0回答:2

我的应用从themoviedb.org中获得最高评分或最受欢迎的电影。enter image description here

我正在尝试用LiveData实现ViewModel来切换这两个按钮。在MainViewModel.java中,我有这个:


    //private static long String TAG = MainViewModel.class.getSimpleName();
    public LiveData<List<MovieRoom>> movies;
    private AppDatabase database;


    /*
        Use constructor to initialize all data that UI needs to populate
     */
    public MainViewModel(@NonNull Application application) {
        super(application);

        // how do I know this was initialized correctly?
        database = AppDatabase.getInstance(this.getApplication());
        //database = AppDatabase.getInstance(application);
        //movies is null after calling ViewModelProvider constructor

        // what are the values in movies?
        // _movieDao = null, mDatabase = null
        movies = database.movieDao().getAllMovies();
    }


    // Loads most popular movies
    public void loadData() {
        //MainViewModel.FetchMovieTask movies = new MainViewModel.FetchMovieTask();
        //movies.execute("popular");
        // Assign to movies
    }

    public void getAllMovies() {
        movies = database.movieDao().getAllMovies();
    }

    public void getPopularMovies() {
        movies = database.movieDao().getPopularMovies();
    }

    public void getTopRatedMovies() {
        movies = database.movieDao().getTopRatedMovies();
    }

    public void getFavoriteMovies() {
        movies = database.movieDao().loadFavoriteMovies(true);
    }

}

在我的MainActivity.java中,按钮具有onclick侦听器,并且我将观察者设置为以下内容:

        b_pop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //updateMovies("popular");
                mViewModel.getPopularMovies();
            }
        });
mViewModel.movies.observe(this, new Observer<List<MovieRoom>>() {
            @Override
            public void onChanged(@Nullable List<MovieRoom> movieEntries) {
                //Log.d(TAG, "Receiving database update from LiveData");
                // mMovieAdapter.mMovies = 0
                mMovieAdapter.clear();
                // movieEntries = 0
                // mMovieAdapter mMovies = 0
                mMovieAdapter.setList(movieEntries);
                mMovieAdapter.notifyDataSetChanged();
            }
        });

问题是,当您用评分最高或最受欢迎的电影列表重新分配ViewModel的“ movies”变量时,它不会触发onChanged()。最受好评的电影列表与最受欢迎的电影列表相同,只是顺序不同。因此onChanged()永远不会触发,我将无法将其设置为适配器。

我正在从0开始学习ViewModel,LiveData和observer,所以不确定如何重新设计它以便可以工作?

java android
2个回答
0
投票

使用LiveData上的value将新获取的数据的值传递给ViewModel:

public void getAllMovies() {
        movies.value = database.movieDao().getAllMovies().value;
}

还需要MutableLiveData

public MutableLiveData<List<MovieRoom>> movies;

0
投票

尝试将movies类型更改为MutableLiveData。

然后您需要按以下方式更改方法:

public void getAllMovies() {
     movies.postValue(database.movieDao().getAllMovies());
}

我有一个非常相似的应用程序,用Kotlin编写。您可以查看了解更多关于ViewModel和LiveData的信息:https://github.com/Ali-Rezaei/TMDb-Paging

还建议您封装:

private MutableLiveData<List<MovieRoom>> movies;

public LiveData<List<MovieRoom>> getMovies() {
    return movies;
}
© www.soinside.com 2019 - 2024. All rights reserved.