1

У меня есть вид Recycler, в котором одна строка содержит несколько видов, включая видео, статистику и кнопку.Предотвращение просмотра внутри одного элемента в представлении Recycler для обновления после обновления адаптера

Кнопка предназначена для увеличения значения подобной статистики для этого элемента и обновления моего адаптера с использованием notifyItemChange для этой позиции.

Моя проблема в том, что эта строка обновляется и обновляет мою статистику, видео сбрасывается, и мне придется снова загружать данные с начала.

Что я хочу, как приложение Facebook, где пользователь добавляет эмоции для элемента с одной строкой, но просмотр (видео) не обновляется, и обновляются только определенные предметы, такие как статистика эмоций.

ответ

3

Вы должны рассмотреть возможность использования

void notifyItemChanged (int position,Object payload) 

и захватить полезную нагрузку в

void onBindViewHolder (VH holder,int position, List<Object> payloads) 

Основываясь на payloads разобранной, вы можете обновить часть вашего view в ViewHolder

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position, List<Object> payloads) { 
    if(payloads == null || payloads.isEmpty()) { 
     onBindViewHolder(holder, position);//your normal method 
    } 
    else { 
     //partial refresh 
    } 
} 
+0

Я использовал notifyItemChange (позиция, «данные полезной нагрузки»), отключенный элемент anima tor для моего просмотра recycler, но метод onBindViewholder с полезной нагрузкой по-прежнему не вызывается, он только называется onBindViewHolder без полезной нагрузки. Есть что-то, что мне не хватает? –

+0

Когда вы назвали 'notifyItemChange'? Это не сработает, если вы используете его сразу после 'setAdapter' – WenChao

+0

@Karate_Dog вы можете обернуть вызов' recyclerview.post() ', если вы хотите использовать его после' setAdapter' – WenChao

2

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

adapter.notifyItemChanged(position, payload); // payload is an Object 

И вы получите эту полезную нагрузку в onBindViewHolder адаптера:

public void onBindViewHolder(HelloViewHolder holder, int position, List<Object> payload) { 
     // decide what to update based on the payload 
} 

Вы можете просмотреть this в качестве примера.

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