简体   繁体   中英

Partial update of RecyclerView.ViewHolder

I'm trying to change the field with time in my RecyclerView . Each individual ViewHolder contains a CardView and a few more views inside. The only view I want to animate is the one with time. As you can see, there is no animation:

adapter.notifyDataSetChanged();

RecyclerView没有动画

Updating items one by one doesn't help because then the whole CardView flashes:

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

在此输入图像描述

Is there a way to get a list of all ViewHolders to then update (animate) just that one TextView inside each one?

You can notify your RecyclerView.Adapter 's observers to issue a partial update of your RecyclerView.ViewHolders by passing a payload Object .

notifyItemRangeChanged(positionStart, itemCount, payload);

Where payload could be or contain a flag that represents relative or absolute time. To bind the payload to your view holders, override the following onBindViewHolder(viewHolder, position, payloads) method in your adapter, and check the payloads parameter for data.

@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);
            }
        }
    }
}

Within your MyViewHolder.bindTimePayload(payload) method, update your time TextViews to the time format specified in the payload .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM