2017-01-23 4 views
0

Я новичок в разработке Android, после того как сделайте сетевой запрос, пытаясь обновить элемент в элементе управления RecyclerView без прокрутки. Насколько я понимаю, элементы обновляются во время прокрутки через onBindViewHolder event.here есть код. Использование метода notifyItemChanged для обновления пользовательского интерфейса, но оно не работает до тех пор, пока пользователь не прокрутит список.RecyclerView не обновляет пользовательский интерфейс после изменения данных

Примечание: favoriteMatches не является моим источником данных. Это еще один список объектов, в котором хранятся избранные пользователи, внутри onBindViewHolder событие. Я чешу, если элемент favoriteMatches.contains(match), то визуализируйте как элемент fav.

call.enqueue(new Callback<AddRemoveFavoriteRequest.Response>() { 
     @Override 
     public void onResponse(Call<AddRemoveFavoriteRequest.Response> call, Response<AddRemoveFavoriteRequest.Response> response) { 
      AddRemoveFavoriteRequest.Response body = response.body(); 
      Utilities.dismissProgressDialog(getActivity(),progressBar); 

      if(body.error == null){ 
       if(add){ 
        favoriteMatches.add(matchId); 
       } 
       else { 
        favoriteMatches.remove(matchId); 
       } 

       adapter.notifyItemChanged(absolutePosition); 
       Preferences.getDefaultPreferences().edit() 
         .putStringSet(Preferences.PREF_FAVORITES,favoriteMatches) 
         .apply(); 

      }else{ 
       Utilities.showSnackBar(getActivity(),recyclerView,body.error); 
      } 
     } 

     @Override 
     public void onFailure(Call<AddRemoveFavoriteRequest.Response> call, Throwable t) { 
      t.printStackTrace(); 
      Utilities.dismissProgressDialog(getActivity(),progressBar); 

     } 
}); 
+0

Что такое 'absolutePosition'? –

+0

Попробуйте использовать 'adapter.notifyDataSetChanged()', если это не работает, тогда ваша проблема в ваших данных. Если это работает, проверьте, правильна ли 'absolutePosition'. –

ответ

1

notifyItemChanged занимает позицию, на которой предмет был изменен.

Вы добавляете и удаляете элементы, чтобы положение перемещалось. Вместо этого вы можете индивидуально уведомлять на своих позициях.

int changedPosition = 0; 
if(add){ 
    changedPosition = favoritesMatches.size(); 
    favoriteMatches.add(matchId); 
    adapter.notifyItemInserted(changedPosition); 
} 
else { 
    changedPosition = favoriteMatches.indexOf(matchId); // might not work 
    favoriteMatches.remove(matchId); 
    adapter.notifyItemRemoved(changedPosition); 
} 

Или, вместо того, чтобы обновить весь список

adapter.notifyDataSetChanged(); 

Подробнее о notifying the adapter, но обратите внимание

адаптер RecyclerView не должны полагаться на notifyDataSetChanged(), так как следует использовать более детальные действия ,

Смежные вопросы