【发布时间】:2020-04-23 11:09:44
【问题描述】:
我不熟悉使用LiveData 和ViewModels,我不完全了解数据是如何更新的。
您无需在每次应用数据更改时都更新 UI,而是 观察者可以在每次发生变化时更新 UI。
这句话对我来说没有意义。我正在使用 Sqlite 数据库(没有 Room),并且我在 ViewModel 的 getItems() 方法中异步获取数据。这是否意味着在数据库中添加或更新数据时,LiveData 会自动检测并调用onChange?
根据 Android 开发网站,它说要开始观察 onCreate 中的 LiveData 对象。在使用LiveData之前,我通过查询数据库然后调用notifyDataSetChanged()来刷新onResume中的数据。
此代码现在在Fragment 加载时显示数据,但如果我删除或向数据库添加新数据,UI 不会反映更改。我只是觉得我对LiveData 的工作原理没有基本的了解,而且我在任何地方都找不到好的解释。
帮助我 StackOverflow,你是我唯一的希望。
public class MyViewModel extends AndroidViewModel {
private MutableLiveData<List<String>> items;
private Application application;
public MyViewModel(@NonNull Application application) {
super(application);
this.application = application;
}
public MutableLiveData<List<String>> getItems() {
if (items == null) {
items = new MutableLiveData<>();
getItems();
}
return items;
}
private void getItems() {
List<String> items = GetItems(); //async process
this.items.setValue(items)
}
}
public class ListFragment extends Fragment {
@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MyViewModel model = ViewModelProviders.of(getActivity()).get(MyViewModel.class);
final Observer<List<String>> observer = new Observer<List<String>>() {
@Override
public void onChanged(List<String> items) {
//update UI
}
};
model.getItems().observe(this, observer);
}
}
【问题讨论】:
-
问题是你只能在
getItems()方法中得到这些项目一次。要使其按预期工作,您需要使用 Room DAO 并观察 ViewModel 中的 DAO。当 ViewModel 中的 DAO 观察者检测到底层数据发生变化时,然后更新 LiveData,然后 Fragment 将获取更新后的数据。 -
我明白了。因此,如果我不使用 Room,使用
LiveData是否有意义? -
在数据库中删除或添加元素后,是否可以再次调用
private void getItems()函数?如果是,请再次调用。 -
我可以将
getItems()公开吗? -
我遇到了与 OP 相同的问题,但我的问题是我的 Fragment 没有获得与我的 Activity 相同的 ViewModel 实例曾是。更多信息:stackoverflow.com/questions/61373456/… .
标签: android android-livedata android-viewmodel