如何从 Room Dao 更改我的 LiveData 的 ViewModel 源

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 单词的源后

Joh*_*lly 3

一种方法可能是使用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)

我在下面做了类似的事情(设置directionhttps://github.com/joreilly/galway-bus-android/blob/master/app/src/main/java/com/surrus/galwaybus/ui/viewmodel/BusStopsViewModel .kt