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
相关产品推荐
相关产品推荐

