Задать вопрос
@Chesterfield25

Почему получаю пустой RecyclerView?

По какой то причине у меня не выводится нужный мне список.

Вот полностью код, в нем ошибок нет, так как с другим апи работает нормально.

public class HomeFragment extends Fragment implements FoodRecyclerViewInterface {
    public HomeFragment() {
        // Required empty public constructor
    }

    private FragmentHomeBinding binding;
    private static String PARSE_URL = "https://api.edamam.com/api/food-database/v2/parser?app_id=e5bc806d&app_key=5f7521ffeefe491b936cea6271e13d3d&ingr=nut";
    List<FoodModels> foodModelsList;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }

    @RequiresApi(api = Build.VERSION_CODES.M)
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        binding = FragmentHomeBinding.inflate(getLayoutInflater());
        View view = binding.getRoot();

        foodModelsList = new ArrayList<>();

        GetData getData = new GetData();
        getData.execute();

        return view;
    }

    @Override
    public void onItemClick(int position) {
        Intent i = new Intent(getActivity(), DetailActivity.class);
        i.putExtra("name", foodModelsList.get(position).getName());
        i.putExtra("img", foodModelsList.get(position).getImg());
        i.putExtra("kcal", foodModelsList.get(position).getKcal());
        i.putExtra("procent", foodModelsList.get(position).getProcent());
        i.putExtra("fat", foodModelsList.get(position).getFat());
        i.putExtra("chocdf", foodModelsList.get(position).getChocdf());
        i.putExtra("fidtg", foodModelsList.get(position).getFidtg());
        startActivity(i);


    }

    public class GetData extends AsyncTask<String, String, String> {

        @Override
        protected String doInBackground(String... strings) {
            String current = "";

            try {
                URL url;
                HttpURLConnection urlConnection = null;

                try {
                    url = new URL(PARSE_URL);
                    urlConnection = (HttpURLConnection) url.openConnection();
                    InputStream is = urlConnection.getInputStream();
                    InputStreamReader isr = new InputStreamReader(is);

                    int data = isr.read();
                    while(data != -1) {
                        current += (char) data;
                        data = isr.read();
                    }

                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    if(urlConnection != null) {
                        urlConnection.disconnect();
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return current;
        }

        @Override
        protected void onPostExecute(String s) {
            try {
                JSONObject jsonObject = new JSONObject(s);
                JSONArray jsonArray = jsonObject.getJSONArray("food");

                for(int i = 0 ; i < jsonArray.length() ; i++) {
                    JSONObject jsonObject1 = jsonArray.getJSONObject(i);

                    FoodModels model = new FoodModels();
                    model.setName(jsonObject1.getString("name"));
                    model.setImg(jsonObject1.getString("img"));
                    model.setKcal(jsonObject1.getString("kcal"));
                    model.setProcent(jsonObject1.getString("procent"));
                    model.setFat(jsonObject1.getString("fat"));
                    model.setChocdf(jsonObject1.getString("chocdf"));
                    model.setFidtg(jsonObject1.getString("fidtg"));

                    foodModelsList.add(model);
                }

            } catch (JSONException e) {
                e.printStackTrace();
            }

            PutDataIntoRecyclerView(foodModelsList);
        }
    }

    private void PutDataIntoRecyclerView(List<FoodModels> categoryList) {
        FoodAdapter categoryAdapter = new FoodAdapter(getContext(), categoryList, this);
        binding.recyclerMain.setHasFixedSize(true);
        binding.recyclerMain.setAdapter(categoryAdapter);
        binding.recyclerMain.setLayoutManager(new LinearLayoutManager(getContext()));
    }
}


Возможно проблема в том что присутствуют вложенные массивы?
Пример полученного ответ от апи

{
  "text": "nut",
  "parsed": [
    {
      "food": {
        "foodId": "food_amqspy5ap567v6bun60usbgsaor7",
        "label": "Nuts",
        "knownAs": "nuts",
        "nutrients": {
          "ENERC_KCAL": 594,
          "PROCNT": 17.3,
          "FAT": 51.45,
          "CHOCDF": 25.35,
          "FIBTG": 9
        },
        "category": "Generic foods",
        "categoryLabel": "food",
        "image": "https://www.edamam.com/food-img/e29/e2985d3585a6950c276e204ba7ba9b2e.jpg"
      }
    }
  ],
  "hints": [
    {
      "food": {
        "foodId": "food_amqspy5ap567v6bun60usbgsaor7",
        "label": "Nuts",
        "knownAs": "nuts",
        "nutrients": {
          "ENERC_KCAL": 594,
          "PROCNT": 17.3,
          "FAT": 51.45,
          "CHOCDF": 25.35,
          "FIBTG": 9
        },
        "category": "Generic foods",
        "categoryLabel": "food",
        "image": "https://www.edamam.com/food-img/e29/e2985d3585a6950c276e204ba7ba9b2e.jpg"
      },
  • Вопрос задан
  • 55 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
@5465
Возможно проблема в том, что вы не разобрали JSON-ответ, чтобы получить список из нужных вам объектов. В вашем случае вы пытаетесь получить список из массива food, но этого массива нет в JSON-ответе, который вы получаете. Вместо этого у вас есть вложенный массив parsed, который содержит объекты, содержащие информацию о еде.

Чтобы получить список из этих объектов, вам нужно будет сначала получить массив parsed из вашего JSON-ответа, а затем перебрать его и извлечь каждый объект food из каждого элемента массива. Вот пример, как это можно сделать:

@Override
protected void onPostExecute(String s) {
    try {
        JSONObject jsonObject = new JSONObject(s);
        JSONArray parsedArray = jsonObject.getJSONArray("parsed");

        for (int i = 0; i < parsedArray.length(); i++) {
            JSONObject parsedObject = parsedArray.getJSONObject(i);
            JSONObject foodObject = parsedObject.getJSONObject("food");

            FoodModels model = new FoodModels();
            model.setName(foodObject.getString("label"));
            model.setImg(foodObject.getString("image"));
            model.setKcal(foodObject.getJSONObject("nutrients").getString("ENERC_KCAL"));
            model.setProcent(foodObject.getJSONObject("nutrients").getString("PROCNT"));
            model.setFat(foodObject.getJSONObject("nutrients").getString("FAT"));
            model.setChocdf(foodObject.getJSONObject("nutrients").getString("CHOCDF"));
            model.setFidtg(foodObject.getJSONObject("nutrients").getString("FIBTG"));

            foodModelsList.add(model);
        }

    } catch (JSONException e) {
        e.printStackTrace();
    }

    PutDataIntoRecyclerView(foodModelsList);
}


Здесь мы получаем массив parsed из JSON-ответа, затем перебираем его и для каждого объекта извлекаем объект food. Затем мы используем данные из объекта food, чтобы создать новый объект FoodModels и добавляем его в наш список foodModelsList. Когда мы закончили, мы вызываем PutDataIntoRecyclerView, чтобы заполнить RecyclerView нашим списком данных.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы