Постановка проблемы
Проблема заключается в этой строке. Stand s = dataset_stand.get (position); , если это комментарий с кодом ниже, Работает без использования второго JSON или второго запроса.
Да, ожидается.Зачем?Потому что вы вызываете метод RecyclerView.Adapter#notifyDataSetChanged()
внутри adicionarListaPartidos(ArrayList<Partido> listaPartidos)
после вставки данных в ArrayList в RecyclerView
классе адаптера массива, который сообщает ArrayAdapter
о перерисовке / обновлении компонентов внутри RecyclerView
контейнера.
Теперь RecycelrView
начинает связывание компонента в методе onBindViewHolder(ListaPartidosAdapter.ViewHolder holder, int position)
.Итак, что здесь происходит?
@Override
public void onBindViewHolder(ListaPartidosAdapter.ViewHolder holder, int position) {
Partido p = dataset.get(position);
String status = p.getStatus();
if (status.equals("SCHEDULED")){
String status_ = "SCH";
holder.status.setText(status_);
}
holder.utcDate.setText(p.getUtcDate());
Partido.EquipoCasa homeTeam = p.getHomeTeam();
// other code
Stand s = dataset_stand.get(position); // <====== the problem
// other code
}
Ваш список dataset_stand
будет пустым (размер списка равен 0), пока вы не получите данные / ответ от метода standingsRespuestaCall.enqueue()
в своей деятельности.
Имейте в виду, что метод Retrofit Call#enque()
является асинхронным.Это означает, что в вашем случае метод obtenerDatos()
выполняется сверху вниз за один удар.Вы получите данные только тогда, когда Retrofit
вернет успешный ответ методом onResponse()
.
Самый простой способ решить эту проблему - закомментировать метод notifyDataSetChanged()
внутри adicionarListaPartidos(ArrayList<Partido> listaPartidos)
.Как показано ниже
public void adicionarListaPartidos(ArrayList<Partido> listaPartidos){
dataset.addAll(listaPartidos);
// notifyDataSetChanged(); // <====== just COMMENT OUT this line
}
Это предотвратит вызов onBindViewHolder()
.Когда второй запрос standingsRespuestaCall.enqueue()
завершает свою работу, ваш код уведомляет об изменении набора данных.Как показано ниже.
public void adicionarListaStands(ArrayList<Stand> listaStands){
dataset_stand.addAll(listaStands);
notifyDataSetChanged(); // <==== DO NOT remove this
}
Примечание: Ваш код проблематичен.Вы используете несколько запросов для заполнения одного контейнера RecyclerView.Ваш RecyclerView не сможет отобразить запись, если standingsRespuestaCall.enqueue()
не получит ответ от сервера.
PS: Пожалуйста, проверьте имена методов, которые я упоминал в своем ответе, и измените код соответствующим образом.Не путайте с именами методов.