Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 通过新的LiveData更新RecyclerView<;列表>;动态从房间返回_Android_Android Recyclerview_Android Room_Android Livedata - Fatal编程技术网

Android 通过新的LiveData更新RecyclerView<;列表>;动态从房间返回

Android 通过新的LiveData更新RecyclerView<;列表>;动态从房间返回,android,android-recyclerview,android-room,android-livedata,Android,Android Recyclerview,Android Room,Android Livedata,我有一个传统的房间->DAO->Livedata->Repository->ViewModel->RecyclerView应用程序。UI的不同按钮必须将不同的数据列表传递给RecyclerView。 按按钮单击我想要: 在DAO中创建新的@Query,并返回新的LiveData对象 将此新数据放入RecycleServiceAdapter并调用notifyDataSetChanged()以生成新的列表视觉效果 Dao@Query: @Query("SELECT * FROM entry_tabl

我有一个传统的房间->DAO->Livedata->Repository->ViewModel->RecyclerView应用程序。UI的不同按钮必须将不同的数据列表传递给RecyclerView。
按按钮单击我想要:

  • 在DAO中创建新的@Query,并返回新的LiveData对象
  • 将此新数据放入RecycleServiceAdapter并调用notifyDataSetChanged()以生成新的列表视觉效果 Dao@Query:

    @Query("SELECT * FROM entry_table WHERE path LIKE :path ORDER BY priority DESC")
    LiveData<List<Entry>> getNotesOfFolder(String path);    //Returns LiveData with List of Entries
    
    @Query(“从条目_表中选择*,其中路径类似:按优先级描述的路径顺序”)
    LiveData getNotesOfFolder(字符串路径)//返回带有条目列表的LiveData
    
    recyclerView通过Observer的onChanged更新,如下所示:

    public class RecyclerViewActivity extends AppCompatActivity {…
    Observer<List<Entry>> entryObserver = new Observer<List<Entry>>() {
        @Override
        public void onChanged(List<Entry> entries) {
            recyclerAdapter.setEntries(entries);
        }
    };
    
    公共类RecycleServiceActivity扩展了AppCompatActivity{… 观察者入口观察者=新观察者(){ @凌驾 更改后的公共作废(列表条目){ recyclerAdapter.setEntries(条目); } }; 公共类RecyclerAdapter扩展了RecyclerView.Adapter{… 公共无效集合项(列表项){ this.entries=entries;//将LiveData内容设置为适配器的列表(即条目) notifyDataSetChanged(); 问题是,当LiveData从DAO接收到新值时,我的观察者没有调用onChange方法。我相信这是因为LiveData的内容没有更改,而是被另一个LiveData替换

    我尝试再次将Observer重新订阅到LiveData,这有点奏效,但当我尝试调用一些常规的房间查询(如@Delete)时,我收到多个(最多10个!)onChange调用,其中一些行为怪异,并将错误列表传递给RVadapter

    因此有两个问题:

  • 我怎样才能调用我的观察者的onChanged()
  • 是否有其他时尚的方式将新的LiveData对象动态传递给RecycleView
  • (一)

    viewModel
    中,为实时数据创建一个getter方法:

    //...
    
    private LiveData<List<Entry>> liveData;
    
    //...
    
    public LiveData<List<Entry>> getLiveData() {
        return liveData;
    }
    
    2)
    DiffUtil
    非常有助于在回收器视图中更新列表,并为您提供一些漂亮的动画

    我尝试再次将Observer重新订阅到LiveData,这有点奏效,但当我尝试调用一些常规的房间查询(如@Delete)时,我收到多个(最多10个!)onChange调用,其中一些行为怪异,并将错误列表传递给RVadapter

    如果您没有首先从旧的LiveData对象中取消订阅您的观察者,这将是有意义的…当您的查询发生更改时,您将替换旧的LiveData对象


    如果查询更新,则需要从DAO获取新的LiveData。如果使用新的LiveData覆盖旧的LiveData,则不仅需要(重新)订阅新的观察者,您还需要从旧的观察者中取消订阅。否则它将继续存在并不断更新观察者。

    您刚才描述了使用LiveData的最简单的情况。我已经知道了所有这些。这不是我要问的。问题是,观察者在我订阅之前不会触发LiveData的新值再次将其写入LiveData。我希望您建议在页面中设置
    refresh
    功能。例如,将
    SwipeRefreshLayout
    添加到布局中。我认为这可能有助于获取更新的数据。
    //...
    
    private LiveData<List<Entry>> liveData;
    
    //...
    
    public LiveData<List<Entry>> getLiveData() {
        return liveData;
    }
    
      @Override
      protected void onCreate(Bundle savedInstanceState) {
    
          //...
    
          viewModel.getLiveData().observe(this, new Observer<List<Entry>>() {
              @Override
              public void onChanged(List<Entry> entryList) {
                  //set new value here
              }
          });
    
      }