Android 改装创建请求后不更新ViewModel
我在一个简单的Android项目中使用改造客户端执行HTTP请求。当我发送创建请求时,该项在远程SQLite数据库中成功创建,但ViewModel仍然包含旧列表。当我重新启动应用程序并再次从服务器获取所有项目时,该项目将出现 我遵循《Android应用程序体系结构指南》,在我的存储库和ViewModel中使用LiveData对象 My Fragment向ViewModel中的LiveData对象添加了一个观察者:Android 改装创建请求后不更新ViewModel,android,android-recyclerview,retrofit2,android-livedata,Android,Android Recyclerview,Retrofit2,Android Livedata,我在一个简单的Android项目中使用改造客户端执行HTTP请求。当我发送创建请求时,该项在远程SQLite数据库中成功创建,但ViewModel仍然包含旧列表。当我重新启动应用程序并再次从服务器获取所有项目时,该项目将出现 我遵循《Android应用程序体系结构指南》,在我的存储库和ViewModel中使用LiveData对象 My Fragment向ViewModel中的LiveData对象添加了一个观察者: mViewModel.getAllItems().observe(getActiv
mViewModel.getAllItems().observe(getActivity(), new Observer<List<Item>>() {
@Override
public void onChanged(@Nullable final List<Item> items) {
// Update the cached copy of the words in the adapter.
mAdapter.setItems(items);
mAdapter.notifyDataSetChanged();
}
});
编辑
相关代码:
ItemViewModel.java
public class ItemViewModel extends AndroidViewModel {
private ItemRepository mItemRepository;
private LiveData<List<Item>> items;
public ItemViewModel(Application application) {
super(application);
this.mItemRepository = new ItemRepository();
}
public LiveData<List<Item>> getAllItems() {
if (this.items == null) {
this.items = mItemRepository.getAllItems();
}
return this.items;
}
public void createItem(Item item) {
this.mItemRepository.createItem(item);
}
}
public class ItemRepository {
private WebService mWebservice;
private MutableLiveData<List<Item>> mAllItems = new MutableLiveData<>();
public ItemRepository() {
this.mWebservice = WebClient.getClient().create(WebService.class);
}
public LiveData<List<Item>> getAllItems() {
final MutableLiveData<List<Item>> data = new MutableLiveData<>();
this.mWebservice.getAllItems().enqueue(new Callback<GetAllItemsResponse>() {
@Override
public void onResponse(Call<GetAllItemsResponse> call, Response<GetAllItemsResponse> response) {
data.setValue(response.body().items);
}
@Override
public void onFailure(Call<GetAllItemsResponse> call, Throwable t) {
System.out.println(t);
}
});
return data;
}
public void insertItem(Item item) {
mWebservice.createItem(item);
}
}
公共类ItemViewModel扩展了AndroidViewModel{
私人物品储存库;
私有数据项;
公共项目视图模型(应用程序){
超级(应用);
this.mItemRepository=新项目存储库();
}
公共LiveData getAllItems(){
if(this.items==null){
this.items=mItemRepository.getAllItems();
}
归还此物品;
}
公共无效createItem(项目){
this.mItemRepository.createItem(item);
}
}
ItemRepository.java
public class ItemViewModel extends AndroidViewModel {
private ItemRepository mItemRepository;
private LiveData<List<Item>> items;
public ItemViewModel(Application application) {
super(application);
this.mItemRepository = new ItemRepository();
}
public LiveData<List<Item>> getAllItems() {
if (this.items == null) {
this.items = mItemRepository.getAllItems();
}
return this.items;
}
public void createItem(Item item) {
this.mItemRepository.createItem(item);
}
}
public class ItemRepository {
private WebService mWebservice;
private MutableLiveData<List<Item>> mAllItems = new MutableLiveData<>();
public ItemRepository() {
this.mWebservice = WebClient.getClient().create(WebService.class);
}
public LiveData<List<Item>> getAllItems() {
final MutableLiveData<List<Item>> data = new MutableLiveData<>();
this.mWebservice.getAllItems().enqueue(new Callback<GetAllItemsResponse>() {
@Override
public void onResponse(Call<GetAllItemsResponse> call, Response<GetAllItemsResponse> response) {
data.setValue(response.body().items);
}
@Override
public void onFailure(Call<GetAllItemsResponse> call, Throwable t) {
System.out.println(t);
}
});
return data;
}
public void insertItem(Item item) {
mWebservice.createItem(item);
}
}
公共类项目存储库{
私有网络服务;
私有MutableLiveData mAllItems=新的MutableLiveData();
公共项目存储库(){
this.mWebservice=WebClient.getClient().create(WebService.class);
}
公共LiveData getAllItems(){
最终的MutableLiveData数据=新的MutableLiveData();
this.mWebservice.getAllItems().enqueue(新回调()命令){
@凌驾
公共void onResponse(调用、响应){
data.setValue(response.body().items);
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
系统输出打印ln(t);
}
});
返回数据;
}
公共无效插入项(项){
mWebservice.createItem(项目);
}
}
公共类ItemViewModel扩展了AndroidViewModel{
私人物品储存库;
私有数据项;
公共项目视图模型(应用程序){
超级(应用);
this.mItemRepository=新项目存储库();
}
公共LiveData getAllItems(){
//if(this.items==null){
this.items=mItemRepository.getAllItems();
// }
归还此物品;
}
公共无效createItem(项目){
this.mItemRepository.createItem(item);
}
}
如果您实际说“您想获取数据”时只需要获取数据,请尝试删除此条件。因此,您可以制作一个LiveData,在其中可以获取新数据
public class RefreshLiveData<T> extends MutableLiveData<T> {
public interface RefreshAction<T> {
private interface Callback<T> {
void onDataLoaded(T t);
}
void loadData(Callback<T> callback);
}
private final RefreshAction<T> refreshAction;
private final Callback<T> callback = new RefreshAction.Callback<T>() {
@Override
public void onDataLoaded(T t) {
postValue(t);
}
};
public RefreshLiveData(RefreshAction<T> refreshAction) {
this.refreshAction = refreshAction;
}
public final void refresh() {
refreshAction.loadData(callback);
}
}
公共类RefreshLiveData扩展了可变LiveData{
公共接口刷新操作{
专用接口回调{
空载空隙率(T);
}
void loadData(回调);
}
私人最终行动;
private final Callback Callback=new RefreshAction.Callback(){
@凌驾
已加载的公共空间(T){
后置值(t);
}
};
公共RefreshLiveData(RefreshAction RefreshAction){
this.refreshAction=refreshAction;
}
公共最终无效刷新(){
refreshAction.loadData(回调);
}
}
那你就可以了
public class YourViewModel extends ViewModel {
private RefreshLiveData<List<Item>> items;
private final ItemRepository itemRepository;
public YourViewModel(ItemRepository itemRepository) {
this.itemRepository = itemRepository;
items = itemRepository.getAllItems();
}
public void refreshData() {
items.refresh();
}
public LiveData<List<Item>> getItems() {
return items;
}
}
公共类YourViewModel扩展了ViewModel{
私有数据项;
私有最终项目存储库项目存储库;
公共YourViewModel(ItemRepository ItemRepository){
this.itemRepository=itemRepository;
items=itemRepository.getAllItems();
}
公共数据(){
items.refresh();
}
公共LiveData getItems(){
退货项目;
}
}
然后,存储库可以执行以下操作:
public RefreshLiveData<List<Item>> getAllItems() {
final RefreshLiveData<List<Item>> liveData = new RefreshLiveData<>((callback) -> {
mWebservice.getAllItems().enqueue(new Callback<List<Item>>() {
@Override
public void onResponse(Call<List<Item>> call, Response<List<Item>> response) {
callback.onDataLoaded(response.body());
}
@Override
public void onFailure(Call<List<Item>> call, Throwable t) {
}
});
});
return liveData;
}
public RefreshLiveData getAllItems(){
final RefreshLiveData liveData=新的RefreshLiveData((回调)->{
mWebservice.getAllItems().enqueue(新回调()命令){
@凌驾
公共void onResponse(调用、响应){
callback.onDataLoaded(response.body());
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
}
});
});
返回liveData;
}
请显示您的viewmodel类codemAdapter.notifyDataSetChanged();您尝试过这个吗?@Ashish我确实在setItems()中调用了notifyDataSetChanged()函数,但是由于项目列表没有更改,因此视图没有更改..谢谢。不幸的是,这并不能解决我的问题。我认为,通过在每次获取项目时重新实例化LiveData对象,一次实例化的观察者将观察旧对象。。