java - 使用 Webservice 响应更新 Recyclerview 的值
问题描述
我在这里有一个复杂的问题。
我用一些数据初始化了我的 RecyclerView,但是我异步地从我的 Web 服务获取数据,我想使用这些数据以便将它们放在我的 RecyclerView 中,但是“为时已晚”,因为我的 RecyclerView 已经初始化。
这是一些代码:
首先我用一些数据初始化我的 Recyclerview
JSONArray medias; <- Global variable
ServiceProvider serviceProvider = new ServiceProvider(); <- Global variable where I'm doing my request
public void performRequest()
{
for (int j = 0; j < 3; j += 1) {
JSONObject newElem = new JSONObject();
newElem.put("path", "test");
newElem.put("state", "ongoing");
newElem.put("name", "element " + j);
medias.put(newElem);
serviceProvider.addMedia(getActivity(), new CallbackInterface() {
@Override
public void callbackaddMedia(Boolean success, JSONObject obj) {
if (success && obj != null)
{
//Here I want to use the response object like
//Update medias item state by obj.optString("state");
}
}
});
}
initRecyclerView();
}
private void initRecyclerView(){
adapter = new DocumentsAdapter(getActivity(),false, medias, this);
LinearLayoutManager mLayoutManager = new LinearLayoutManager(getContext());
binding.recyclerAll.setLayoutManager(mLayoutManager);
binding.recyclerAll.setItemAnimator(new DefaultItemAnimator());
binding.recyclerAll.setAdapter(adapter);
}
就像我说的那样,我异步调用一个 Web 服务,它每次都会向我发送一个这样的响应,并且每次都有不同的 mediaId 和状态:
{
"success": true,
"mediaId": "307",
"state": "success"
}
解决方案
就像评论中所说的那样,我使用了这样的方法 notifyDataSetChanged() :
for (int k = 0; k < medias.length(); k += 1) {
JSONObject mediaObject = (JSONObject) medias.opt(k);
if (mediaObject.optString("gUid").equals(obj.optString("guid"))) {
mediaObject.put("state", obj.optString("state"));
mediaObject.put("id", obj.optString("mediaId"));
mediaObject.put("path", obj.optString("path"));
if (getActivity() != null) {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
if (adapter != null) {
// I'm on my Fragment so I call my adapter like this , If you want to do this on your adapter , just call notifyDataSetChanged();
adapter.notifyDataSetChanged();
}
}
});
}
break;
}
}
我刚刚更新了我的 RecyclerView 适配器中发送的 JSONArray“媒体”的一项。然后在那之后,我只是在 MAINTHREAD 上调用了 notifyDataSetChanged()。它将自动更新我的 JSONArray 中的所有值,从而更改我的布局中的值
推荐阅读
- rest - 无法在本地网络中从 Linux 访问 REST API URL 到 Windows
- asp.net - 单一端口中的 ASP.net Web 服务和 Web Api
- c - 从共享库中安全地调用 openSSL 函数
- ios - AppDelegate 和 SwiftUI 视图之间的通信
- javascript - 在 div 中包含可拖动元素而不会溢出
- docker - 安装 Docker 时包 moby-runc-*+azure-2.x86_64.rpm 未签名
- python-3.x - 如何使用预训练的 .caffemodel 在 python 上对单个图像执行预测
- kubernetes - 从集群内部调用时的 503 响应代码
- django - Django 管理界面不执行服务器端检查以确定 csrf 令牌的有效性
- css - 未显示的按钮轮廓