首页 > 解决方案 > 如何根据在另一个 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);

    }

}

标签: javaandroid

解决方案


借助图像加载库,您可以在 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);
  }

}


推荐阅读