Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.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 改装创建请求后不更新ViewModel_Android_Android Recyclerview_Retrofit2_Android Livedata - Fatal编程技术网

Android 改装创建请求后不更新ViewModel

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

我在一个简单的Android项目中使用改造客户端执行HTTP请求。当我发送创建请求时,该项在远程SQLite数据库中成功创建,但ViewModel仍然包含旧列表。当我重新启动应用程序并再次从服务器获取所有项目时,该项目将出现

我遵循《Android应用程序体系结构指南》,在我的存储库和ViewModel中使用LiveData对象

My Fragment向ViewModel中的LiveData对象添加了一个观察者:

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对象,一次实例化的观察者将观察旧对象。。