如何通过匹配来自两个 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 的响应到单个回收器视图适配器中?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有匹配索引的情况下比较来自两个 DF 的两个日期?

如何缓存来自 cognito 的 ID 令牌,以便后续访问 API 网关?

根据日期检查来自同一表的记录,其中包含多行中的不匹配值

匹配来自不同表的行 - MySQL

如何在 VueJS 的 HTML 和脚本的其他部分中使用来自 API 响应的 id

在项目中搜索来自 Gitlab API 的多个用户 ID 的合并请求