2016-06-06 10 views
0

Ich versuche, diese Animation zu tun:RecyclerView ItemAnimator animateAdd & animateChange beides gleichzeitig?

enter image description here

ein neues Objekt andere nach unten einfügen, wie es standardmäßig der Fall ist. aber der erste Gegenstand und der zweite Wechsel. das erste wird mit ViewType 1 eingefügt, dann das zweite, das den ViewType auf 2 setzt. Ich verwalte derzeit 3 ​​Ansichtstypen (adaptadorNotificaciones.java).

1 voller Größe. notificacion_item1.xml

2 Polsterung. notificacion_item2.xml

3 Separator. section.xml

ich von DefaultItemAnimator wie folgt erweitern (animadroNotificaciones):

public class animadroNotificaciones extends DefaultItemAnimator { 

@Override 
public boolean animateAdd(RecyclerView.ViewHolder holder){ 
    return true; 
} 

public boolean animateChange(RecyclerView.ViewHolder oldHolder, RecyclerView.ViewHolder newHolder, int fromX, int fromY, int toX, int toY){ 
    return super.animateChange(oldHolder,newHolder,fromX,fromY,toX,toY); 
} 

@Override 
public void onAnimationFinished(RecyclerView.ViewHolder holder){ 
    super.onAnimationFinished(holder); 
} 


@Override 
public boolean animateMove(RecyclerView.ViewHolder holder, int fromX, int fromY, int toX, int toY){ 
    return super.animateMove(holder,fromX,fromY,toX,toY); 
}} 

ich es auch wie ein Stapel picturing bin:

LinearLayoutManager llm = new LinearLayoutManager(this); 
    llm.setOrientation(LinearLayoutManager.VERTICAL); 
    llm.setReverseLayout(true); 
    llm.setStackFromEnd(true); 
    recyclerView.setLayoutManager(llm); 

so, wenn ich ein Element hinzufügen, die Schriftrolle hat sich zu bewegen up:

recyclerView.scrollToPosition(arreglo.size()-1); 

Der gesamte Code zum Einfügen eines Elements (adaptadorNotificaciones.java):

public void addNotificacion(ItemLista notificacion,RecyclerView recyclerView){ 
    String mesAnterior = ""; 
    String mesInsertado = ""; 

    if(arreglo.size()!=0) 
     mesAnterior = ManejadorFechas.getFecha(arreglo.get(arreglo.size()-1).getTiempo(),false); 
    mesInsertado = ManejadorFechas.getFecha(notificacion.getTiempo(),false); 

    if(!mesInsertado.equals(mesAnterior) && arreglo.size()!=0){ 

     arreglo.get(arreglo.size()-1).setTipo(2); 
     arreglo.add(new ItemLista(3,mesAnterior)); 
     arreglo.add(notificacion); 

     notifyItemRangeChanged(arreglo.size()-3,arreglo.size()-1); 
     recyclerView.scrollToPosition(arreglo.size()-1); 

    }else if(arreglo.size()!=0){ 
     arreglo.get(arreglo.size()-1).setTipo(2); 
     arreglo.add(notificacion); 
     notifyItemRangeChanged(arreglo.size()-2,arreglo.size()-1); 
     recyclerView.scrollToPosition(arreglo.size()-1); 
    }else{ 
     arreglo.add(notificacion); 
     notifyItemInserted(arreglo.size()-1); 
     recyclerView.scrollToPosition(arreglo.size()-1); 
    } 
} 

aber der obige Code gibt mir das nächste Ergebnis:

enter image description here

Ich denke, es durch die folgende Zeile verursacht:

notifyItemRangeChanged(arreglo.size()-3,arreglo.size()-1); 

jemand eine Idee hat Wie behebt man das? Danke im Voraus.

Antwort

0

Ich löste es, auf diese Weise:

rv.setItemAnimator(new animadroNotificaciones(){ 
      @Override 
      public void onAnimationFinished(RecyclerView.ViewHolder viewHolder) { 
       adaptador.notifyDataSetChanged(); 
      } 
     });