java - 如何根据在另一个 JsonArray 响应中收到的响应在循环中发出 Android Volley 请求
问题描述
我正在使用 volley 发出 JsonArray 请求,然后在 recyclerview 中显示数据。我在这里尝试做的是多次(在循环中)调用另一个 Web 服务,从上一个 Web 服务调用中获取特定属性的值。例如:如果我有这样的 Web 服务响应:
[
{
"RollNo": 7000026,
"DOB": "18-11-21",
"Mobile": null,
"Name": "Richard John",
"Class": "6",
"Section": "A",
},
{
"RollNo": "7000057",
"DOB": "18-11-22",
"Mobile": null,
"Name": "Sam Jonas",
"Class": "6",
"Section": "A"
}
]
然后,我需要获取 的值RollNo
并将其传递给另一个给我学生照片的 Web 服务,在这种情况下,我必须调用 Student Image Web 服务两次。然后,一旦获取了所有数据和图像,我就必须在回收站视图中显示数据。我无法理解如何在我的代码中编写该逻辑。感谢任何帮助。
当前用于 Web 服务调用和解析响应的 Java 代码:
public void STUDENT_DUE(){
String HTTP_SERVER_URL= String.format("http://pastebin.com/);
JsonArrayRequest jsArrRequest = new JsonArrayRequest
(Request.Method.GET, HTTP_SERVER_URL, null, new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
STUDENT_DUE_PARSE_DATA_AFTER_WEBCALL(response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// TODO Auto-generated method stub
}
}){
};
requestQueue = Volley.newRequestQueue(this);
requestQueue.add(jsArrRequest);
}
public void STUDENT_DUE_PARSE_DATA_AFTER_WEBCALL(JSONArray array){
for(int i = 0; i<array.length(); i++) {
StudentDataModel GetStudentDataModel = new StudentDataModel();
JSONObject json = null;
try {
json = array.getJSONObject(i);
GetStudentDataModel.setName(json.getString("RollNo"));
GetStudentDataModel.setRank(json.getString("DOB"));
GetStudentDataModel.setPerId(json.getString("Mobile"));
GetStudentDataModel.setFromDuty(json.getString("Name"));
GetStudentDataModel.setToDuty(json.getString("Class"));
GetStudentDataModel.setHomeStation(json.getString("Section"));
} catch (JSONException e) {
e.printStackTrace();
}
StuDataAdapterClassList.add(GetStudentDataModel);
}
if (array.length() != 0) {
recyclerViewAdapter = new StudentCardAdapter(StuDataAdapterClassList, this);
recyclerView2.setAdapter(recyclerViewAdapter);
}
}
解决方案
借助图像加载库,您可以在 RecyclerAdapter 内部覆盖 onBindViewHolder 以调用第二个 Web 服务。例如,您可以使用 Glide 库来加载图像。我假设您使用 get 方法调用第二个 Web 服务并通过 RollNo 获取每张图片。
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
String roleNumber = StudentData.get(position).GetName;
if (roleNumber != null) {
GlideApp.with(context)
.load("http://via.placeholder.com/roleNumber")
.override(100, 200)
.fitCenter() // scale to fit entire image within ImageView
.into(ivImg);
} else {
// make sure Glide doesn't load anything into this view
Glide.clear(holder.imageView);
// remove the placeholder (optional); read comments below
holder.imageView.setImageDrawable(null);
}
}
推荐阅读
- vue.js - 根据条件在vue中渲染组件
- reactjs - 如何使用 recharts 实现条形图的内部曲线
- c# - 如何创建可以读取 excel 表并将其转换为特定格式的 Windows 应用程序?
- azure-functions - .NET 5 - 找不到框架“Microsoft.NETCore.App”,版本“3.1.0”
- unity3d - Unity 2D - 无法拖动、移动或重新缩放任何东西
- python - 如何有效地更新 Django Serializer 中的嵌套对象
- python - 如何用序列图显示一个类和另一个以类实例的实例作为输入的类之间的关系?
- html - 在水平滚动上看不到垫表背景颜色
- c# - Azure Service Fabric 中的 NodeType 和 ScaleSet 有什么区别
- discord - 如何让我的不和谐机器人自动回复任何消息