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();
}
}
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
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
Puoi mostrarmi il tuo codice. nel caso tu stia utilizzando un'animazione con ascoltatore, penso che dovresti informare l'adattatore riciclatore su AnimazioneFinito() – Boukharist