2016-04-30 13 views
17

Próbuję zmienić pole z czasem w moim RecyclerView. Każda osoba ViewHolder zawiera CardView i kilka innych widoków w środku. Jedyny widok, który chcę animować, to ten z czasem. Jak widać, nie ma animacji:Częściowa aktualizacja RecyclerView.ViewHolder

adapter.notifyDataSetChanged(); 

RecyclerView with no animations

Aktualizacja pozycje jedna po drugiej nie pomaga, bo wtedy cała CardView błysków:

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

enter image description here

Czy istnieje sposób, aby uzyskać listę wszystkich ViewHolders, aby następnie zaktualizować (animować) tylko ten jeden TextView w każdym z nich?

+1

Musisz dodać element animator –

Odpowiedz

35

Możesz powiadomić swoich obserwatorów RecyclerView.Adapter o częściowej aktualizacji swojego RecyclerView.ViewHolders, przekazując ładunek Object.

notifyItemRangeChanged(positionStart, itemCount, payload); 

przypadku payload mogą stanowić lub mogą zawierać znacznik, który reprezentuje względny lub bezwzględny czas. Aby powiązać obiekty payload z posiadaczami widoków, należy zastąpić następującą metodę w adapterze onBindViewHolder(viewHolder, position, payloads) i sprawdzić parametr dla danych.

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

W swoim sposobie MyViewHolder.bindTimePayload(payload), aktualizować swój czas TextViews z formatem czasowym określonym w payload.

+1

Działa pięknie. Dziękuję Ci bardzo. – PhpXp

+0

Brat, którego uratowałeś dzień, pracował jak zaklęcie, miałem zamiar zmienić widok recyklingu na viewpager. Ale twoja odpowiedź sprawiła, że ​​również nauczyłem się i uratowałem wiele godzin ciężkiej pracy –