当前位置: 首页 > 知识库问答 >
问题:

如何在ViewModel中更改来自房间Dao LiveData的源代码

百里渊
2023-03-14

我如何从房间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();
}

我还有存储库类:

public class WordRepository {
   public LiveData<List<Word>> getWordsByAsc() {
       return wordDao.getWordsByAsc();
   }

   public LiveData<List<Word>> getWordsByDesc() {
       return wordDao.getWordsByDesc();
   }
}

和我的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()
    }
}

在我的活动中,我添加了观察者:

 wordViewModel.getWords().observe(this, new Observer<List<Word>>() {
      @Override
      public void onChanged(@Nullable List<Word> words) {
          adapter.setWords(words);
      }
 });

LiveData的viewModel类源如何根据“isSortAsc”参数变化(words=isSortAsc?wordrepository.getwordsbyasc():wordrepository.getwordsbydesc()

它只在更改屏幕配置后工作,而不是在insta更改LiveData words的源码后工作

共有1个答案

储臻
2023-03-14

一种方法可能是使用MediatorLiveData.....例如:

val words = MediatorLiveData<Word>().apply {
    this.addSource(sortDirection) {
        if (sortDirection.value) {
             this.value = wordRepository.getWordsByAsc()
        } else {
             this.value = wordRepository.getWordsByDesc()
        }
    }
}

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

 类似资料:
  • 我有一个intelliJ项目,它工作得很好,直到我在项目文件夹上单击鼠标右键,意外地为它创建了一个maven pom。我不确定我单击的选项的确切名称(它不是我试图单击的选项)。ctrl-z什么也没做,所以我删除了pom。现在我被一个只使用java 1.5编译的项目所困扰。 我尝试再次添加pom,并设置属性,如此问题所示。我还尝试进入项目设置,在那里我可以清楚地看到项目语言级别设置为SDK默认值(8

  • 我想把一个网站的css从python改成selenium。 到目前为止,我所做的是获得CSS的价值。 我想更改此css的值。 运行下面的Python代码的结果:0px 0px 0px 270px 从0px 0px 0px 270px如何将其更改为0px 0px 0px 0px? 我尝试过这些事情,但最终并不是所有的都成功。 驾驶员执行_脚本(“参数[0].style.margin='0px 0px

  • 问题内容: 最后,我将开发环境从runserver迁移到gunicorn / nginx。 将runserver的自动重载功能复制到gunicorn会很方便,因此当源更改时,服务器会自动重新启动。否则,我必须使用手动重新启动服务器。 有什么方法可以避免手动重启? 问题答案: 尽管这是一个老问题,但您需要知道自19.0版以来就可以选择。因此,现在不需要第三方工具。

  • 问题内容: 最后,我将开发环境从runserver迁移到gunicorn / nginx。 将runserver的自动重载功能复制到gunicorn会很方便,因此当源更改时,服务器会自动重新启动。否则,我必须使用手动重新启动服务器。 有什么办法可以避免手动重启? 问题答案: 尽管这是一个古老的问题,但仅出于一致性考虑-因为19.0版本的gunicorn可以–reload选择。因此,不再需要第三方工

  • 问题内容: 我正在开发一个android程序。用户单击一个按钮,我做了一些数学运算,并且我想更改某些TextView对象中的视图上的值。有人可以告诉我该怎么做吗? 问题答案: 你想做什么?您是否真的要在用户单击按钮时动态更改TextView对象中的文本?如果有原因,您当然可以这样做,但是,如果文本是静态的,则通常在main.xml文件中进行设置,如下所示: 字符串“ @ string / rate

  • 问题内容: 每当我在Eclipse中创建一个新的Java文件并选中add选项时,都会生成以下代码: 我如何: 删除评论 更改缩进,以使每个{都位于一行上 删除TODO自动生成的注释 问题答案: 缩进是格式问题,而注释是模板问题。 模板位于 窗口- >首选项-> Java->代码样式->代码模板中。浏览所有这些内容,并查找您想要更改的内容。 格式化程序有点复杂。您可以在 Window- > Pref