Частичное обновление RecyclerView.ViewHolder

Я пытаюсь изменить поле со временем в RecyclerView. Каждый ViewHolder содержит CardView и еще несколько видов внутри. Единственный взгляд, который я хочу оживить, - это со временем. Как вы можете видеть, анимации нет:

adapter.notifyDataSetChanged();

RecyclerView без анимации

Обновление элементов по одному не помогает, потому что тогда все CardView мигает:

int len = adapter.getItemCount();
for(int i=0;i<len;i++) {
    adapter.notifyItemChanged(i);
}

введите описание изображения здесь

Есть ли способ получить список всех ViewHolders, чтобы затем обновить (оживить) только один TextView внутри каждого из них?

Ответы

Ответ 1

Вы можете уведомить своих наблюдателей RecyclerView.Adapter о частичном обновлении вашего RecyclerView.ViewHolders, передав полезную нагрузку Object.

notifyItemRangeChanged(positionStart, itemCount, payload);

Где payload может быть или содержать флаг, представляющий относительное или абсолютное время. Чтобы привязать payload к вашим держателям, переопределите следующий onBindViewHolder(viewHolder, position, payloads) метод в вашем адаптере и проверьте параметр payloads для данных.

@Override
public void onBindViewHolder(MyViewHolder viewHolder, int position, List<Object> payloads) {
    if (payloads.isEmpty()) {
        // Perform a full update
        onBindViewHolder(viewHolder, position);
    } else {
        // Perform a partial update
        for (Object payload : payloads) {
            if (payload instanceof TimeFormatPayload) {
                viewHolder.bindTimePayload((TimeFormatPayload) payload);
            }
        }
    }
}

В вашем методе MyViewHolder.bindTimePayload(payload) обновите свое время TextViews до формата времени, указанного в payload.