根据偏好更改侦听器更改 android 视图模型的查询参数
change the query parameter of android view model on the basis of preference change listener
我在我的应用程序中使用架构组件。我使用了分页,但我有一个问题,如果参数根据首选项发生更改,如何重新查询数据库。因为视图模型是在 oncreate 方法中设置的,所以我们在视图模型构造函数中调用 Dao 接口上的查询。
我试图在 onPreferenceChangeLitener 中重新创建视图模型,但它不起作用。
我的主要activity是-
public class MainActivity extends AppCompatActivity implements SharedPreferences.OnSharedPreferenceChangeListener{
private static final String TAG = MainActivity.class.getSimpleName();
RecyclerView rvDisplayMovie;
MovieAdapter mAdapter;
MainActivityViewModel mViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rvDisplayMovie = (RecyclerView) findViewById(R.id.rv_display_movies);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
rvDisplayMovie.setLayoutManager(linearLayoutManager);
mAdapter = new MovieAdapter();
rvDisplayMovie.setAdapter(mAdapter);
MainViewModelFactory factory = InjectorUtils.provideMainViewModelFactory(this);
mViewModel = ViewModelProviders.of(this, factory).get(MainActivityViewModel.class);
mViewModel.getMovies().observe(this, new Observer<PagedList<MovieEntry>>() {
@Override
public void onChanged(@Nullable PagedList<MovieEntry> movieEntries) {
Log.d(TAG,"Movie list changed"+movieEntries.size());
mAdapter.submitList(movieEntries);
}
});
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
sharedPreferences.registerOnSharedPreferenceChangeListener(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
sharedPreferences.unregisterOnSharedPreferenceChangeListener(this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_settings,menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_settings:
Intent intent = new Intent(this, SettingsActivity.class);
startActivity(intent);
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String s) {
mViewModel.triggerPrefsChenged(this);
}
}
并且视图模型是-
public class MainActivityViewModel extends ViewModel {
private static final String TAG = MainActivityViewModel.class.getSimpleName();
private PopularMovieRepository mRepository;
private LiveData<PagedList<MovieEntry>> mMovies;
public MainActivityViewModel(PopularMovieRepository repository, int movieType){
mRepository = repository;
mMovies = mRepository.getMoviesList(movieType);
}
public LiveData<PagedList<MovieEntry>> getMovies() {
return mMovies;
}
public void triggerPrefsChenged(Context context){
int movieType = PreferenceUtils.getMovieType(context);
mRepository.initializeData(movieType);
}
}
triggerPrefsChenged 方法下载新数据并将其插入数据库
您的方法存在一个问题,即您的 mMovies
被硬编码为初始 movieType
(您传入 MainActivityViewModel
的那个)。您应该修改 mMovies
用法,以便它可以对 movieType
更改做出反应。
一个好的方法是创建一个额外的 LiveData
对象来侦听 movieType
变化,然后使用 Transformations.switchMap
触发新类型的 mRepository.getMoviesList(movieType)
调用.因此,您的 ViewModel 可能如下所示:
public class MainActivityViewModel extends ViewModel {
private static final String TAG = MainActivityViewModel.class.getSimpleName();
private PopularMovieRepository mRepository;
private final MutableLiveData<Integer> mMovieTypeLiveData = new MutableLiveData();
private final LiveData<PagedList<MovieEntry>> mMovies;
public MainActivityViewModel(PopularMovieRepository repository, int movieType){
mRepository = repository;
mMovies = Transformations.switchMap(movieTypeLive, (movieType) -> {
return mRepository.getMoviesList(movieType);
});
//set the initial value
mMovieTypeLiveData.setValue(movieType);
}
public LiveData<PagedList<MovieEntry>> getMovies() {
return mMovies;
}
public void triggerPrefsChenged(Context context){
int movieType = PreferenceUtils.getMovieType(context);
//mRepository.initializeData(movieType);
mMovieTypeLiveData.setValue(movieType);
}
}
我在我的应用程序中使用架构组件。我使用了分页,但我有一个问题,如果参数根据首选项发生更改,如何重新查询数据库。因为视图模型是在 oncreate 方法中设置的,所以我们在视图模型构造函数中调用 Dao 接口上的查询。
我试图在 onPreferenceChangeLitener 中重新创建视图模型,但它不起作用。
我的主要activity是-
public class MainActivity extends AppCompatActivity implements SharedPreferences.OnSharedPreferenceChangeListener{
private static final String TAG = MainActivity.class.getSimpleName();
RecyclerView rvDisplayMovie;
MovieAdapter mAdapter;
MainActivityViewModel mViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rvDisplayMovie = (RecyclerView) findViewById(R.id.rv_display_movies);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
rvDisplayMovie.setLayoutManager(linearLayoutManager);
mAdapter = new MovieAdapter();
rvDisplayMovie.setAdapter(mAdapter);
MainViewModelFactory factory = InjectorUtils.provideMainViewModelFactory(this);
mViewModel = ViewModelProviders.of(this, factory).get(MainActivityViewModel.class);
mViewModel.getMovies().observe(this, new Observer<PagedList<MovieEntry>>() {
@Override
public void onChanged(@Nullable PagedList<MovieEntry> movieEntries) {
Log.d(TAG,"Movie list changed"+movieEntries.size());
mAdapter.submitList(movieEntries);
}
});
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
sharedPreferences.registerOnSharedPreferenceChangeListener(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
sharedPreferences.unregisterOnSharedPreferenceChangeListener(this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_settings,menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_settings:
Intent intent = new Intent(this, SettingsActivity.class);
startActivity(intent);
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String s) {
mViewModel.triggerPrefsChenged(this);
}
}
并且视图模型是-
public class MainActivityViewModel extends ViewModel {
private static final String TAG = MainActivityViewModel.class.getSimpleName();
private PopularMovieRepository mRepository;
private LiveData<PagedList<MovieEntry>> mMovies;
public MainActivityViewModel(PopularMovieRepository repository, int movieType){
mRepository = repository;
mMovies = mRepository.getMoviesList(movieType);
}
public LiveData<PagedList<MovieEntry>> getMovies() {
return mMovies;
}
public void triggerPrefsChenged(Context context){
int movieType = PreferenceUtils.getMovieType(context);
mRepository.initializeData(movieType);
}
}
triggerPrefsChenged 方法下载新数据并将其插入数据库
您的方法存在一个问题,即您的 mMovies
被硬编码为初始 movieType
(您传入 MainActivityViewModel
的那个)。您应该修改 mMovies
用法,以便它可以对 movieType
更改做出反应。
一个好的方法是创建一个额外的 LiveData
对象来侦听 movieType
变化,然后使用 Transformations.switchMap
触发新类型的 mRepository.getMoviesList(movieType)
调用.因此,您的 ViewModel 可能如下所示:
public class MainActivityViewModel extends ViewModel {
private static final String TAG = MainActivityViewModel.class.getSimpleName();
private PopularMovieRepository mRepository;
private final MutableLiveData<Integer> mMovieTypeLiveData = new MutableLiveData();
private final LiveData<PagedList<MovieEntry>> mMovies;
public MainActivityViewModel(PopularMovieRepository repository, int movieType){
mRepository = repository;
mMovies = Transformations.switchMap(movieTypeLive, (movieType) -> {
return mRepository.getMoviesList(movieType);
});
//set the initial value
mMovieTypeLiveData.setValue(movieType);
}
public LiveData<PagedList<MovieEntry>> getMovies() {
return mMovies;
}
public void triggerPrefsChenged(Context context){
int movieType = PreferenceUtils.getMovieType(context);
//mRepository.initializeData(movieType);
mMovieTypeLiveData.setValue(movieType);
}
}