web-dev-qa-db-ja.com

RecyclerView.ViewHolderの部分更新

RecyclerViewで時間とともにフィールドを変更しようとしています。個々のViewHolderには、CardViewと内部にいくつかのビューが含まれています。アニメーション化するビューは、時間のあるビューのみです。ご覧のとおり、アニメーションはありません。

adapter.notifyDataSetChanged();

RecyclerView with no animations

CardView全体が点滅するため、アイテムを1つずつ更新しても役に立ちません。

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

enter image description here

すべてのViewHoldersのリストを取得してから、各TextViewを更新(アニメーション)する方法はありますか?

28
PhpXp

ペイロードObjectを渡すことにより、_RecyclerView.Adapter_のオブザーバーに_RecyclerView.ViewHolders_の部分的な更新を発行するよう通知できます。

_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)メソッド内で、時間TextViewspayloadで指定された時間形式に更新します。

55
Ryan