2015-03-15 5 views
18

Ich habe einige grundlegende Artikel Dekoration, die einige Sachen in ItemDecoration.onDrawOver Methode zeichnet.Wie RecyclerView Artikel Dekoration Zeichnung für die Dauer der Element Animationen deaktivieren

Diese RecyclerView hat auch DefaultItemAnimator gesetzt. Animationen funktionieren, alles ist großartig. Außer einer Sache.

Wenn alle vorhandenen Elemente mit einem neuen Elementsatz in diesem Adapter ausgetauscht werden, werden die Dekorationen angezeigt, während die Animation ausgeführt wird.

Ich brauche eine Möglichkeit, sie zu verstecken. Wenn die Animation beendet ist, müssen sie angezeigt werden, aber während sie läuft, müssen sie ausgeblendet werden.

Ich habe versucht, die folgenden:

public void onDrawOver(..., RecyclerView.State state) { 
    if(state.willRunPredictiveAnimations() || state.willRunSimpleAnimations()) { 
     return; 
    } 
    // else do drawing stuff here 
} 

aber das ist nicht zu helfen. Die Dekoration wird nur für die kurze Zeit der Animation entfernt, erscheint dann aber wieder, während sie noch läuft.

Auch Setup enthält eine RecyclerView.Adapter, dieStableIds() hat (falls dieses Bit zählt).

Antwort

24

Es kann hängen etwas von der Art der Animation du bist:

Um Artikel Dekorationen während eines Artikels Animation verstecken man einfach dieses Kontroll in onDraw/onDrawOver verwenden können mit, aber mindestens für DefaultItemAnimator müssen Sie die X/Y-Übersetzung berücksichtigen, die während der Animation ausgeführt wird. Sie können diese Werte mit child.getTranslationX() und child.getTranslationY() erhalten.

Zum Beispiel für den vertikalen Fall von onDraw/onDrawOver:

private void drawVertical(Canvas c, RecyclerView parent) { 
    final int left = parent.getPaddingLeft(); 
    final int right = parent.getWidth() - parent.getPaddingRight(); 
    final int childCount = parent.getChildCount(); 
    final int dividerHeight = mDivider.getIntrinsicHeight(); 

    for (int i = 1; i < childCount; i++) { 
     final View child = parent.getChildAt(i); 
     final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); 
     final int ty = (int)(child.getTranslationY() + 0.5f); 
     final int top = child.getTop() - params.topMargin + ty; 
     final int bottom = top + dividerHeight; 
     mDivider.setBounds(left, top, right, bottom); 
     mDivider.draw(c); 
    } 
} 

(Sie können es vorziehen, ViewCompat.getTranslationY(child) zu verwenden, wenn Sie < API 11. unterstützen müssen)

Hinweis: für andere Arten von Animationen, Weitere Anpassungen müssen möglicherweise vorgenommen werden. (Zum Beispiel, horizontale Übersetzung könnte auch berücksichtigt werden müssen.)

7

eine Antwort selbst gefunden:

public void onDrawOver(..., RecyclerView parent, ...) { 
    if(parent.getItemAnimator() != null && parent.getItemAnimator().isRunning()) { 
     return; 
    } 
    // else do drawing stuff here 
} 
+4

Mit diesem Ansatz bewirkt, dass die Dekorationen für einen Moment verschwinden und dann wieder nach der Animation, die ich fand nicht so schön wie die Dekorationen animieren. Jedoch, +1 sowieso weil 'getItemAnimator(). IsRunning()' ist nützliche Information. :) –

+0

@LorneLaliberte ja, ich fand diese unglückliche Nebenwirkung auch. Wenn Sie einen Weg finden, teilen Sie bitte ... – dimsuz

+0

Siehe meine Antwort für einen Ansatz, der dies löst, indem Sie die Dekorationen zusammen mit den Standardanimationen animieren. –