如何通过匹配来自两个 API 的 id 来查看来自两个 JSON API 的响应到单个回收器视图适配器中?
Posted
技术标签:
【中文标题】如何通过匹配来自两个 API 的 id 来查看来自两个 JSON API 的响应到单个回收器视图适配器中?【英文标题】:How to view responses from two JSON API into single recycler view adapter by matching ids from both APIs? 【发布时间】:2021-05-24 13:08:12 【问题描述】:我从两个不同的 JSON API 获得响应,其中 id 对象在两个 API 中都很常见。 我想知道第一个响应中的 id 在第二个响应中出现了多少次。 就像如果第一个响应中的 id="642" 在第二个响应中出现两次,那么 count =2。 像这样为每个 id 设置它,然后将其设置在回收器视图中,以便为适配器内部的 txtCountNo 的每个位置。
第一反应:
[
"id": "642"
"Full_name": "Harsh",
,
"id": "91"
"Full_name": "Rahul",
]
第二反应:
[
"Uniq_id": "36",
"id": "91"
,
"Uniq_id": "37",
"id": "642"
,
"Uniq_id": "38",
"id": "642"
,
"Uniq_id": "39",
"id": "91"
]
我已在适配器中使用此代码显示名称:
public class PhotographyAdapter extends RecyclerView.Adapter<PhotographyAdapter.MyViewHolder>
List<PhotographyModel> photographyList;
public PhotographyAdapter(List<PhotographyModel> photographyList, Context context)
this.photographyList = photographyList;
this.context = context;
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType)
View view = LayoutInflater.from(context).inflate(R.layout.item_feed_post, parent, false);
return new MyViewHolder(view);
@RequiresApi(api = Build.VERSION_CODES.O)
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position)
holder.txtUserName.setText(photographyList.get(position).getFullName())
@Override
public int getItemCount()
return photographyList.size();
public class MyViewHolder extends RecyclerView.ViewHolder
TextView txtUserName,txtCountNo;
public MyViewHolder(@NonNull View itemView)
super(itemView);
txtUserName = itemView.findViewById(R.id.txtUserName);
txtCountNo = itemView.findViewById(R.id.txtCountNo);
摄影模特:
public class PhotographyModel
@SerializedName("Full_name")
@Expose
private String fullName;
@SerializedName("id")
@Expose
private String Id;
public String getFullName()
return fullName;
public void setFullName(String fullName)
this.fullName = fullName;
public String getId()
return Id;
public void setId(String Id)
this.Id =Id;
喜欢模特:
public class LikeModel
@SerializedName("Uniq_id")
@Expose
private String uniqId;
@SerializedName("id")
@Expose
private String Id;
public String getUniqId()
return uniqId;
public void setUniqId(String uniqId)
this.uniqId = uniqId;
public String getId()
return Id;
public void setId(String Id)
this.Id = Id;
调用第一个 API:
public void getFirstApiResponse()
progressBar.setVisibility(View.VISIBLE);
Call<List<PhotographyModel>> ourSupplierResponseCall = RestClient.getClient().getPhotographyPosts();
ourSupplierResponseCall.enqueue(new Callback<List<PhotographyModel>>()
@Override
public void onResponse(Call<List<PhotographyModel>> call, Response<List<PhotographyModel>> response)
if (response.isSuccessful())
progressBar.setVisibility(View.GONE);
Log.d(TAG, "onResponse: " + response.toString());
List<Photography> photographyList1;
photographyAdapter = new PhotographyAdapter(photographyList1,getContext());
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity());
rvPhotographyFragment.setLayoutManager(layoutManager);
rvPhotographyFragment.setAdapter(photographyAdapter);
@Override
public void onFailure(Call<List<PhotographyModel>> call, Throwable t)
progressBar.setVisibility(View.GONE);
Toast.makeText(getActivity(), "Something went wrong...Please try later!", Toast.LENGTH_SHORT).show();
);
调用第二个 API:
public void getSecondApiResponse()
Call<List<Like>> responseCall = RestClient.getClient().getLikes();
responseCall.enqueue(new Callback<List<Like>>()
@Override
public void onResponse(Call<List<Like>> call, Response<List<Like>> responseLike)
responseLike.body();
Log.d(TAG, "onResponse: " + responseLike.body().toString());
@Override
public void onFailure(Call<List<Like>> call, Throwable t)
);
任何帮助将不胜感激。 谢谢。
【问题讨论】:
【参考方案1】:你可以这样做,
创建一个Integer和Integer的hashMap。 调用第二个 API 并遍历您收到的所有响应项。使用此详细信息填充 HashMap,例如添加 id 作为键并默认添加值 1。但在 HashMap 中搜索该特定 id 是否存在之前,如果它已经存在,则更新该 id 并通过增加当前值来设置值,如果它不存在,则只需将值设置为 1。
现在您已经准备好一个 HashMap,其中包含适当 id 的计数。
现在调用第一个 API 并从 HashMap 中获取该 ID 的计数。 否则您可以在模型类中添加一个计数字段并在响应时保存计数
【讨论】:
我已经添加了两个api的调用代码,你可以通过查看我的代码来编写你所评论的代码。 对不起@PratikChauhan,但我没有那么多时间。您可以逐步尝试我在这里提到的内容,如果您在任何时候遇到困难,请在线查找解决方案。【参考方案2】:您创建的模型类基本上用于读取响应 1 和响应 2。
如果您创建一个不同的类,就像需要显示的 UI 一样。 所以说如果响应 1 给了我 ID 和名称,响应 2 给了我 ID 和 COUNT 然后我只需在一个类文件中创建一个 ID NAME 和 COUNT 的不同类。
然后,当我调用 API 1 进行响应时,我会将相关数据存储在根据 UI 创建的类的相关变量中。 同样的过程我会为 SECOND Response 做。
一旦我获得了包含响应的 API 列表,我将设置适配器。
或
我什至可以在第一次 API 调用和第二次 API 调用时简单地通过 notifyDatasetChanged 设置适配器。
【讨论】:
以上是关于如何通过匹配来自两个 API 的 id 来查看来自两个 JSON API 的响应到单个回收器视图适配器中?的主要内容,如果未能解决你的问题,请参考以下文章
如何缓存来自 cognito 的 ID 令牌,以便后续访问 API 网关?