Изменение элемента RecyclerView после загрузки данных с сервера Android

Всем привет. У меня есть стандартный RecyclerView, куда я подгружаю данные с сервера (список новостей). Также прописана возможность ставить лайки для каждой новости. Когда пользователь ставит лайк, клиент отправляет данные на сервер и проверяет их. Если у пользователя есть права для выставления лайка, если он ещё не ставил лайк новости, сервер изменяет информацию в БД и возвращает код 200. На данный момент я знаю, что можно менять отображение лайка сразу после клика в адаптере (регистрировать нажатие на кнопку в onBindViewHolder). Или добавлять элемент и менять отображение всего списка через adapter.notifyDataSetChanged();

А можно ли каким-то образом изменить конкретный элемент из RecyclerView, после положительного ответа от сервера, предварительно записав position элемента?


Ответы (1 шт):

Автор решения: Andrew

Для таких целей можно использовать 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 имеет доступ ко всем виджетам элемента списка, поэтому можете обновить то что вам нужно. Так же можно добавить какое-то действие если сервер вернет ошибку.

→ Ссылка