Android 通过新的LiveData更新RecyclerView<;列表>;动态从房间返回
我有一个传统的房间->DAO->Livedata->Repository->ViewModel->RecyclerView应用程序。UI的不同按钮必须将不同的数据列表传递给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
按按钮单击我想要:
@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
因此有两个问题:
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
}
});
}