2016-02-11 10 views
7

Vorrei creare un elenco di chat con animatoin con ritardo (20 s). Dopo questo tempo ogni oggetto dovrebbe scomparire con l'animazione in dissolvenza.Come rimuovere l'elemento da RecyclerView con ritardo

Non è un problema se utilizzo RecyclerView senza scorrere. Sovrascrivo il metodo nell'adattatore e tutto funziona correttamente.

@Override 
    public void onViewAttachedToWindow(final ViewHolder holder) { 
     if(holder.alpha == null) { 

      holder.alpha = ObjectAnimator.ofFloat(holder.itemView, View.ALPHA, 1f, 0f); 

      holder.alpha.setDuration(300); 
      holder.alpha.setStartDelay(20000); 
      holder.alpha.addListener(new Animator.AnimatorListener() { 
       @Override 
       public void onAnimationStart(Animator animation) { 

       } 

       @Override 
       public void onAnimationEnd(Animator animation) { 
       holder.profilePic.setEnabled(false); 
       holder.messageContainer.setEnabled(false); 
        if (items.size() > 0) { 
         items.remove(0); 
         notifyItemRemoved(0); 
        } 

       } 

       @Override 
       public void onAnimationCancel(Animator animation) { 
       } 

       @Override 
       public void onAnimationRepeat(Animator animation) { 

       } 
      }); 
      holder.alpha.start(); 
     } 
    } 

    @Override 
    public void onViewDetachedFromWindow(ViewHolder holder) { 
     if(holder.alpha != null) { 
      holder.alpha.cancel(); 
      holder.alpha = null; 
     } 
    } 

Sto visualizzando 6 messaggi in visualizzazione riciclatore.

Il problema si verifica quando lo scorrimento è abilitato. (Non sto usando il metodo onViewDetachedFromWindow per lo scorrimento abilitato). Se utilizzo la soluzione (su), ho riutilizzato lo spazio ViewHolder con le animazioni. Ogni itemView da ViewHolder holder ha animazione. Se 7 messege recevied allora questo messaggio ha già un'animazione dal titolare riutilizzato. Ma l'animazione in onViewAttachedToWindow si aggiunge nuovamente per la stessa vista.

Non riesco a trovare la soluzione per l'animazione di ogni messaggio in RecyclerView. Ho provato ad usare LayoutAnimationController per l'animazione ogni bambino o usando LayoutManager per lo stesso.

Prova filmato: https://www.dropbox.com/s/1sxdonpasq6lf0o/IMG_0262.MOV?dl=0

Qualche idea?

[Edit:]

// Hnalder to remove item from RecyclerView 
Handler removeItems = new Handler() { 
     @Override 
     public void handleMessage(Message msg) { 
      if(adapter != null && adapter.getItemCount() > 0) { 
       adapter.removeFirst(); 
      } 
     } 
    }; 

... 
//Fragment::initRecyclerView 
... 
chatView.setLayoutManager(layoutManager); 
chatView.setAdapter(adapter); 
chatView.setItemAnimator(new ChatItemAnimator()); 


//ChatAdapter::removeFirst() 
public void removeFirst() { 
    items.removeFirst(); 
    notifyItemRemoved(0); 
} 

//ChatItemAnimator 
public class ChatItemAnimator extends BaseItemAnimator { 
    @Override 
    protected void animateRemoveImpl(RecyclerView.ViewHolder holder) { 
     ViewCompat.animate(holder.itemView) 
       .alpha(0) 
       .setDuration(300) 
       .setListener(new DefaultRemoveVpaListener(holder)) 
       .start(); 
    } 
} 

risposta

1

ho avuto un caso molto simile, quindi vi suggerisco di effettuare le seguenti operazioni:

1- Creare un CustomView per voi chatListItem con un CountdownTimer.

2- Avviare il timer utilizzando un metodo startTimer() all'interno della classe customview e si distrugge l'elemento alla fine.

3- Utilizzare questo recyler animation library per animare i tuoi articoli su ItemRemoved.

+0

Hai ragione sull'utilizzo della visualizzazione personalizzata ad esempio: 'LinearLayout' (senza riutilizzare le viste). Probabilmente questo problema sparirà. Ma l'esibizione non andrà bene. Sto usando questa libreria. – Michael

+0

Thx Boukharist. Sto usando il gestore con ritardo, basta rimuovere l'animazione dell'oggetto e di dissolvenza. Ma dopo averlo rimosso, sembra che un paio di messaggi siano stati raggruppati in uno solo perché la dissolvenza non è ancora terminata, ma tutti gli elementi nella visualizzazione Recycler stanno salendo perché il primo elemento viene rimosso. (Ho sempre rimosso il primo elemento - più vecchio). Qualche idea su come avviare l'animazione prima di rimuoverla? – Michael

+0

Puoi mostrarmi il tuo codice. nel caso tu stia utilizzando un'animazione con ascoltatore, penso che dovresti informare l'adattatore riciclatore su AnimazioneFinito() – Boukharist