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

RecyclerView为空问题:如何解析hints中的food及nutrients数据

RecyclerView为空?问题出在JSON解析逻辑上

你的核心问题是JSON解析逻辑错误——根JSON对象里根本没有"food"数组,food是hints数组中每个元素的子对象。直接调用jsonObject.getJSONArray("food")会抛出异常,导致整个解析流程中断,foodModelsList始终为空,RecyclerView自然没数据。

你的JSON结构(简化版)

"hints": [
    {
      "food": {
        "foodId": "food_amqspy5ap567v6bun60usbgsaor7",
        "label": "Nuts",
        "nutrients": {
          "ENERC_KCAL": 594,
          "PROCNT": 17.3,
          "FAT": 51.45,
          "CHOCDF": 25.35,
          "FIBTG": 9
        },
        // 其他字段...
      },
      "measures": [/*...*/]
    }
]

修正后的JSON解析代码

try {
    JSONObject jsonObject = new JSONObject(s);
    JSONArray hintsArray = jsonObject.getJSONArray("hints");
    
    for(int i = 0 ; i < hintsArray.length() ; i++) {
        // 先取hints数组里的单个对象
        JSONObject hintObj = hintsArray.getJSONObject(i);
        // 从hint对象里取出food子对象
        JSONObject foodObj = hintObj.getJSONObject("food");
        
        FoodModels model = new FoodModels();
        // 获取food的label
        model.setName(foodObj.getString("label"));
        
        // 获取nutrients里的各项数据
        JSONObject nutrientsObj = foodObj.getJSONObject("nutrients");
        model.setCalories(nutrientsObj.getDouble("ENERC_KCAL"));
        model.setProtein(nutrientsObj.getDouble("PROCNT"));
        model.setFat(nutrientsObj.getDouble("FAT"));
        model.setCarbs(nutrientsObj.getDouble("CHOCDF"));
        model.setFiber(nutrientsObj.getDouble("FIBTG"));
        
        // 把其他food字段也存到model里(比如foodId、image等)
        model.setFoodId(foodObj.getString("foodId"));
        model.setImageUrl(foodObj.getString("image"));
        
        foodModelsList.add(model);
    }
    
    // 解析完成后通知Adapter更新数据
    foodAdapter.notifyDataSetChanged();

} catch (JSONException e) {
    // 捕获异常,方便排查问题
    e.printStackTrace();
}

补充FoodModels类(需要对应字段)

你需要完善FoodModels类,添加存储nutrients和其他food字段的属性:

public class FoodModels {
    private String name;
    private String foodId;
    private String imageUrl;
    private double calories;
    private double protein;
    private double fat;
    private double carbs;
    private double fiber;

    // Getter和Setter方法
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }

    public String getFoodId() { return foodId; }
    public void setFoodId(String foodId) { this.foodId = foodId; }

    public String getImageUrl() { return imageUrl; }
    public void setImageUrl(String imageUrl) { this.imageUrl = imageUrl; }

    public double getCalories() { return calories; }
    public void setCalories(double calories) { this.calories = calories; }

    public double getProtein() { return protein; }
    public void setProtein(double protein) { this.protein = protein; }

    public double getFat() { return fat; }
    public void setFat(double fat) { this.fat = fat; }

    public double getCarbs() { return carbs; }
    public void setCarbs(double carbs) { this.carbs = carbs; }

    public double getFiber() { return fiber; }
    public void setFiber(double fiber) { this.fiber = fiber; }
}

调整Adapter的绑定逻辑(如果要显示nutrients)

修改FoodAdapter的onBindViewHolder方法,把nutrients数据绑定到对应的TextView:

@Override
public void onBindViewHolder(@NonNull FoodAdapter.MyViewHolder holder, int position) {
    FoodModels model = mData.get(position);
    holder.name.setText(model.getName());
    // 绑定nutrients数据
    holder.kcal.setText(String.valueOf(model.getCalories()) + " kcal");
    holder.procent.setText(String.valueOf(model.getProtein()) + "g 蛋白质");
    holder.fat.setText(String.valueOf(model.getFat()) + "g 脂肪");
    holder.chocdf.setText(String.valueOf(model.getCarbs()) + "g 碳水");
    holder.fidtg.setText(String.valueOf(model.getFiber()) + "g 纤维");
}

额外注意点

  • 必须捕获JSONException,否则解析出错直接崩溃,无法排查问题
  • 解析完成后必须调用adapter.notifyDataSetChanged(),通知RecyclerView刷新数据
  • 确保foodModelsList和Adapter引用的是同一个列表对象,避免数据源不一致

内容的提问来源于stack exchange,提问作者sounds of nature

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 20:18:08