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();
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
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With