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

