2015-04-26 9 views
40

Projemde"change" animasyonu notifyItemChanged'u devre dışı bırakmam gerekir. NotifyItemChanged'in animasyonunu devre dışı bırakmak için RecyclerView öğesinin ItemAnimator'ı nasıl uygulanır?

Ben RecyclerView kaynağında araştırdık ve aşağıda android.support.v7.widget.DefaultItemAnimator geçersiz etmişti:

private static class ItemAnimator extends DefaultItemAnimator 
{ 
    @Override 
    public boolean animateChange(RecyclerView.ViewHolder oldHolder, RecyclerView.ViewHolder newHolder, int fromX, int fromY, int toX, int toY) { 
     if(oldHolder != null) 
     { 
      oldHolder.itemView.setVisibility(View.INVISIBLE); 
      dispatchChangeFinished(oldHolder, true); 
     } 

     if(newHolder != null) 
     { 
      dispatchChangeFinished(newHolder, false); 
     } 

     return false; 
    } 
} 

Ama Google belgenin spec eşleşirse emin değilim: benim anlayışıma göre RecyclerView.ItemAnimator.animateChange

Kaynak kodu, yöntemi düzgün bir şekilde geçersiz kılmazsam, eskiHolder , geri dönüştürülmez.

Lütfen animateChange'un nasıl geçersiz kılınacağına dair bana yardımcı olun.

+0

bu doğru çözümü için buraya bakınız: http://stackoverflow.com/a/42969391/2220337 – cjurjiu

cevap

82

AnimateChange'ı kaldırmak için doğru çözümü buldum.

Çok basit. Google, işlevselliği hayata geçirdi.

((SimpleItemAnimator) RecyclerView.getItemAnimator()).setSupportsChangeAnimations(false); 

Dokümantasyon: setSupportsChangeAnimations

+14

'setSuportChangeAnimations (boolean)' 'getItemAnimator()' ile döndürülen 'ItemAnimator' içinde doğrudan tanımlanmadı, ancak [SimpleItemAnimator] 'da bulunabilir (http://developer.android.com/reference/android /support/v7/widget/SimpleItemAnimator.html). Yani ((SimpleItemAnimator) RecyclerView.getItemAnimator() olmalıdır. SetSupportsChangeAnimations (false); – convexHull

+1

Ayrıca * DefaultItemAnimator * 'da tanımlanmıştır ve bunu şu şekilde yapabilirsiniz: '((DefaultItemAnimator) recyclerView.getItemAnimator()) .setSupportsChangeAnimations (false); – Juancho

31

Aynı problem vardı. NotifyItemChanged çağrıldığında kırmızı bir yer paylaşımı yanıp sönüyordu. Kodunuzdaki etrafında denedikten sonra nihayet sadece RecyclerView üzerinde

recyclerView.setItemAnimator(null); 

arayarak varsayılan Animator kaldırıldı.

+4

recyclerView.setItemAnimator (boş); RecyclerView'ın tüm animasyonlarını kaldıracak. Sadece animateChange'ı kaldırmak istiyorum. Cevabınız için teşekkür ederiz. – Kenny

+0

Mükemmel, sadece mükemmel –

+0

Sorunu çözmek yerine soru? O.o Sadece mükemmel bir fikir! –

3

DefaultItemAnimator tarafından verilen bütün animasyonlar tutmak isteyen herkes için bir çözüm bulundu, ancak görünüm her güncellendiğinde oluşur "yanıp" animasyon kurtulmanın ise .

İlk olarak, DefaultItemAnimator kaynak kodunu edinin. Projenizde aynı ada sahip bir sınıf oluşturun.

İkincisi, bu yüzden gibi, modifiye DefaultItemAnimator yeni örneğine ItemAnimator ayarlayın:

recyclerView.setItemAnimator(new MyItemAnimator()); 

Sonra yeni sınıflar kaynak kodunda gidip Şimdi yöntemini

animateChangeImpl(final ChangeInfo changeInfo) { ... } 

bulun sadece alfa değerlerini değiştiren metod çağrılarını bulmak zorundayız. Aşağıdaki iki satırı bulun ve oc (0) ve olanları a (1)

oldViewAnim.alpha(0).setListener(new VpaListenerAdapter() { ... } 
newViewAnimation.translationX(0).translationY(0).setDuration(getChangeDuration()).alpha(1).setListener(new VpaListenerAdapter() { ... } 

gibi google yöntemini setSupportsChangeAnimations() kaldırmak için bunu

oldViewAnim.setListener(new VpaListenerAdapter() { ... } 
newViewAnimation.translationX(0).translationY(0).setDuration(getChangeDuration()).setListener(new VpaListenerAdapter() { ... } 
7

@Kenny cevap artık işe yaramadı kaldırmak (ancak neden?) destek kitaplığında 23.1.0.

Bazı durumlarda, setChangeDuration(0) geçici çözüm olarak çalışabilir.

@edit Böyle bir şey kullanmanızı öneririz:

RecyclerView.ItemAnimator animator = recyclerView.getItemAnimator(); 
     if (animator instanceof SimpleItemAnimator) { 
      ((SimpleItemAnimator) animator).setSupportsChangeAnimations(false); 
     } 
+0

, bu nedenle temelde bir şekerlemenin ardından aynı yöntemi kullanıyorsunuz? – Karoly

+1

Şu anda yazımın hiç bir anlamı yok çünkü Kenny yazımı kendi yazdığımdan sonra düzenlenmişti. Önceki kenny uygulaması bunun için kendi çözümünü yapıştırmak için 23.1.0+ destek kütüphanesinde çalışmıyor. – Shu

+0

Tamam, açıklama için teşekkürler. oylama kazanıldı :) – Karoly

2

benim gibi biri sendeler Sadece eğer:
nasılsa setSupportsChangeAnimations(false) benim için işe yaramadı, ama recyclerView.getItemAnimator().setChangeDuration(0) sadece güzel animasyon kaldırmıştır.

1

kolay çözüm DefaultItemAnimator uzatmaktır ve sağ yapıcı içinde false için setSupportsChangeAnimations ayarlayın:

public class DefaultItemAnimatorNoChange extends DefaultItemAnimator { 
    public DefaultItemAnimatorNoChange() { 
     setSupportsChangeAnimations(false); 
    } 
} 
İlgili konular