You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中如何解析含多数组的JSON到RecyclerView?已尝试仅显最后数据

解决Android中多平行数组JSON解析到RecyclerView的问题

看起来你遇到的问题是JSON里的三个平行数组无法完整解析并展示到RecyclerView,只显示最后一条数据,这大概率是你在循环解析时没有正确创建新的数据对象,或者循环逻辑有误导致覆盖了之前的数据。咱们一步步来解决这个问题:

第一步:确认数据结构与实体类

你的JSON是三个长度相同的数组,每个索引位置的三个元素对应RecyclerView的一个Item,所以首先要定义正确的BuyData实体类,包含三个字段来对应data1、data2、data3的元素:

public class BuyData {
    private String data1;
    private String data2;
    private String data3;

    // 构造方法
    public BuyData(String data1, String data2, String data3) {
        this.data1 = data1;
        this.data2 = data2;
        this.data3 = data3;
    }

    // Getter方法(RecyclerView适配器需要获取这些值)
    public String getData1() {
        return data1;
    }

    public String getData2() {
        return data2;
    }

    public String getData3() {
        return data3;
    }
}

第二步:修正JSON解析逻辑

你之前的代码只拿到了数组,但可能在循环时复用了同一个BuyData对象,导致每次赋值都覆盖了之前的数据。正确的做法是遍历数组的索引,每个索引创建一个新的BuyData并添加到列表:

try {
    Log.e("res_gallery123456", responseString);
    JSONObject jsonObj = new JSONObject(responseString);
    
    // 获取三个数组
    JSONArray data1Array = jsonObj.getJSONArray("data1");
    JSONArray data2Array = jsonObj.getJSONArray("data2");
    JSONArray data3Array = jsonObj.getJSONArray("data3");
    
    // 确保三个数组长度一致(避免数组越界)
    int itemCount = data1Array.length();
    if (data2Array.length() != itemCount || data3Array.length() != itemCount) {
        Log.e("ParseError", "三个数组长度不一致!");
        return;
    }
    
    // 创建存储所有数据的列表
    List<BuyData> buyDataList = new ArrayList<>();
    
    // 遍历每个索引,组合数据
    for (int i = 0; i < itemCount; i++) {
        // 每个循环都创建新的BuyData对象!
        String d1 = data1Array.getString(i);
        String d2 = data2Array.getString(i);
        String d3 = data3Array.getString(i);
        BuyData buyData = new BuyData(d1, d2, d3);
        buyDataList.add(buyData);
    }
    
    // 这里将buyDataList传给RecyclerView的适配器
    yourRecyclerViewAdapter.setData(buyDataList);
    yourRecyclerViewAdapter.notifyDataSetChanged();
    
} catch (JSONException e) {
    e.printStackTrace();
    Log.e("ParseError", "JSON解析失败:" + e.getMessage());
}

第三步:检查RecyclerView适配器

确保你的适配器正确接收列表数据并绑定到Item上,示例适配器核心代码:

public class BuyDataAdapter extends RecyclerView.Adapter<BuyDataAdapter.ViewHolder> {
    private List<BuyData> mDataList;

    public BuyDataAdapter(List<BuyData> dataList) {
        this.mDataList = dataList;
    }

    // 提供更新数据的方法
    public void setData(List<BuyData> dataList) {
        this.mDataList = dataList;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.your_item_layout, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        BuyData item = mDataList.get(position);
        holder.tvData1.setText(item.getData1());
        holder.tvData2.setText(item.getData2());
        holder.tvData3.setText(item.getData3());
    }

    @Override
    public int getItemCount() {
        return mDataList != null ? mDataList.size() : 0;
    }

    static class ViewHolder extends RecyclerView.ViewHolder {
        TextView tvData1;
        TextView tvData2;
        TextView tvData3;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            tvData1 = itemView.findViewById(R.id.tv_data1);
            tvData2 = itemView.findViewById(R.id.tv_data2);
            tvData3 = itemView.findViewById(R.id.tv_data3);
        }
    }
}

关键错误点说明

你之前只显示最后一条数据,很可能是因为:

  • 在循环中没有每次创建新的BuyData对象,而是一直修改同一个对象的属性,导致列表里所有元素都指向同一个对象,最后显示的是最后一次赋值的结果。
  • 循环逻辑错误,比如只遍历了最后一个索引,或者没有将每个对象添加到列表中。

按照上面的代码修改后,应该就能完整展示所有数据了!

内容的提问来源于stack exchange,提问作者Darshi Domadiya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:09:42