Изменение элемента RecyclerView после загрузки данных с сервера Android
Всем привет.
У меня есть стандартный RecyclerView, куда я подгружаю данные с сервера (список новостей). Также прописана возможность ставить лайки для каждой новости. Когда пользователь ставит лайк, клиент отправляет данные на сервер и проверяет их. Если у пользователя есть права для выставления лайка, если он ещё не ставил лайк новости, сервер изменяет информацию в БД и возвращает код 200.
На данный момент я знаю, что можно менять отображение лайка сразу после клика в адаптере (регистрировать нажатие на кнопку в onBindViewHolder). Или добавлять элемент и менять отображение всего списка через adapter.notifyDataSetChanged();
А можно ли каким-то образом изменить конкретный элемент из RecyclerView, после положительного ответа от сервера, предварительно записав position элемента?
Ответы (1 шт):
Для таких целей можно использовать notifyItemChanged(). Суть данного метода в том что вы можете изменить отображение конкретного элемента передав данному методу позицию нужного вам элемента. Например у вас есть условие что если ответ 200, то нужно изменить элемент:
if(response.code==200){
}
дальше внутрь этого блока следует поместить обновление нужного вам элемента. Но стоит учитывать что вам нужно знать какую позицию стоит обновить, поэтому в метод который отправляет данные на сервер нужно отправить и позицию нажатого вами элемента и вызывать метод:
notifyItemChanged(position, 0)
дальше в адаптере нужно переопределить метод который отвечает за обновление конкретного элемента. При вызове метода notifyItemChanged(position, 0) вы кроме позиции передаете грубо говоря идентификатор действия, то есть говорите например что поменять фон у картинки на зеленый так как ответ 200:
@Override
public void onBindViewHolder(MyViewHolder holder, int position, List<Object> payloads) {
if (!payloads.isEmpty()) {
switch(payloads.get(0))
{
case 0:
holder.textView.setText("200 response");
break;
case 1:
holder.textView.setText("some error");
break;
}
} else {
super.onBindViewHolder(holder, position, payloads);
}
}
в примере выше, вы при удачном ответе будете сетить в виджет элемента списка текст. В этом методе holder имеет доступ ко всем виджетам элемента списка, поэтому можете обновить то что вам нужно. Так же можно добавить какое-то действие если сервер вернет ошибку.