6

Ho un RecyclerView che utilizza un LinearLayoutManager (verticale). Quello che sto cercando di ottenere è che il divisore della decorazione dell'oggetto (larghezza piena e 1px di altezza) si animi con la vista quando la vista viene spostata (la traduzioneY() la gestisce correttamente) e quando la vista cambia altezza. Nel codice corrente che ho qui sotto, il divisore salterà alla posizione futura del fondo della vista piuttosto che al fondo corrente durante l'animazione. C'è un modo in cui posso tenere conto delle variazioni di altezza nella decorazione degli oggetti durante l'animazione per rendere l'animazione un aspetto migliore?Come posso disegnare ItemDecoration correttamente quando l'elemento RecyclerView sta animando la sua altezza?

Sto modificando l'altezza della vista utilizzando notifyItemChanged() sull'adattatore per RecyclerView.

public class DividerItemDecoration extends RecyclerView.ItemDecoration { 
    private Drawable mDivider; 

    public DividerItemDecoration(Context context) { 
     mDivider = context.getResources().getDrawable(R.drawable.line_divider); 
    } 

    @Override 
    public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) { 
     int right = parent.getWidth(); 
     int dividerHeight = mDivider.getIntrinsicHeight(); 

     int childCount = parent.getChildCount(); 
     for (int i = 0; i < childCount - 1; i++) { 
      View child = parent.getChildAt(i); 
      View nextChild = parent.getChildAt(i + 1); 

      RecyclerView.LayoutParams layoutParams1 = 
        (RecyclerView.LayoutParams) child.getLayoutParams(); 
      RecyclerView.LayoutParams layoutParams2 = 
        (RecyclerView.LayoutParams) nextChild.getLayoutParams(); 
      int left = 0; 
      if (layoutParams1 != null && layoutParams2 != null) { 
       left = Math.min(layoutParams1.leftMargin, layoutParams2.leftMargin); 
      } 

      int ty = (int) (child.getTranslationY() + 0.5f); 
      int top = child.getBottom() + ty; 
      int bottom = top + dividerHeight; 

      mDivider.setBounds(
        left, 
        top, 
        right, 
        bottom); 
      mDivider.draw(c); 
     } 
    } 
} 
+0

Questo è solo qualcosa che non è possibile nella decorazione elemento api? – DungFu

+0

quindi ... le normali animazioni (aggiungi, rimuovi) animeranno correttamente la decorazione, ma quando cambierai l'altezza delle viste, salterà semplicemente? in tal caso, potresti fornire il codice modificando l'altezza delle viste? animate il cambio di altezza della vista? A proposito, la decorazione stessa sembra a posto. –

+0

L'altezza viene modificata automaticamente dall'animatore predefinito di recyclerview (avendo una vista interna impostata su GONE) – DungFu

risposta

2

Ho avuto lo stesso problema. Risolto questo aggiungendo la transizione del bambino ai calcoli nel metodo onDraw, in questo modo:

@Override 
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { 
    int left = parent.getPaddingLeft(); 
    int right = parent.getWidth() - parent.getPaddingRight(); 

    int childCount = parent.getChildCount(); 
    for (int i = 0; i < childCount - 1; i++) { 
     View child = parent.getChildAt(i); 
     RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); 
     //Here is the trick! 
     int top = child.getBottom() + params.bottomMargin + Math.round(child.getTranslationY()); 
     int bottom = top + mDivider.getIntrinsicHeight(); 
     mDivider.setBounds(left, top, right, bottom); 
     mDivider.draw(c); 
    } 
} 
Problemi correlati