kod*_*usz 5 android viewmodel android-room android-livedata android-architecture-components
如何从 Room Dao 更改我的 LiveData 的 ViewModel 源。在 WordDao 中,我有两个查询:
@Dao
public interface WordDao {
@Query("SELECT * FROM " + Word.TABLE_NAME + " ORDER BY text ASC")
LiveData<List<Word>> getWordsByAsc();
@Query("SELECT * FROM " + Word.TABLE_NAME + " ORDER BY text DESC")
LiveData<List<Word>> getWordsByDesc();
}
Run Code Online (Sandbox Code Playgroud)
我也有 Repository 类:
public class WordRepository {
public LiveData<List<Word>> getWordsByAsc() {
return wordDao.getWordsByAsc();
}
public LiveData<List<Word>> getWordsByDesc() {
return wordDao.getWordsByDesc();
}
}
Run Code Online (Sandbox Code Playgroud)
和我的 ViewModel 类:
public class WordViewModel extends AndroidViewModel {
private boolean isSortAsc = true;
private LiveData<Word> words;
private WordRepository wordRepository;
public WordViewModel(@NonNull Application application) {
super(application);
wordRepository = new WordRepository(application);
words = wordRepository.getWordsByAsc();
}
public LiveData<List<Word>> getWords() {
return words;
}
public void sortButtonClicked() {
isSortAsc = !isSortAsc;
//TODO how change here source of data depending on the isSortAsc
//It works only after change configuration of screen, not insta
words = isSortAsc ? wordRepository.getWordsByAsc() :
wordRepository.getWordsByDesc()
}
}
Run Code Online (Sandbox Code Playgroud)
在我的活动中,我添加了观察者:
wordViewModel.getWords().observe(this, new Observer<List<Word>>() {
@Override
public void onChanged(@Nullable List<Word> words) {
adapter.setWords(words);
}
});
Run Code Online (Sandbox Code Playgroud)
在 setWords(words) 方法中,我也调用了“notifyDataSetChanged()”。
LiveData 的 viewModel 类源如何根据“isSortAsc”参数发生变化(words = isSortAsc ? wordRepository.getWordsByAsc() : wordRepository.getWordsByDesc()
它仅在更改屏幕配置后才有效,而不是在更改 LiveData 单词的源后
一种方法可能是使用MediatorLiveData....例如:
val words = MediatorLiveData<Word>().apply {
this.addSource(sortDirection) {
if (sortDirection.value) {
this.value = wordRepository.getWordsByAsc()
} else {
this.value = wordRepository.getWordsByDesc()
}
}
}
Run Code Online (Sandbox Code Playgroud)
我在下面做了类似的事情(设置direction)
https://github.com/joreilly/galway-bus-android/blob/master/app/src/main/java/com/surrus/galwaybus/ui/viewmodel/BusStopsViewModel .kt
| 归档时间: |
|
| 查看次数: |
3878 次 |
| 最近记录: |