我的应用从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,所以不确定如何重新设计它以便可以工作?
使用LiveData上的value
将新获取的数据的值传递给ViewModel:
public void getAllMovies() {
movies.value = database.movieDao().getAllMovies().value;
}
还需要MutableLiveData
public MutableLiveData<List<MovieRoom>> movies;
尝试将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;
}