2015-04-16 7 views
8

Qui è il mio scenarioAndroid RecyclerView scoprire prima e l'ultima vista sul ItemDecoration

  • devo aggiungere spazio sul primo e l'ultimo punto di Recycler Visualizza
  • che sto facendo in modo da utilizzare ItemDecoration

    recyclerView.addItemDecoration(new RecyclerView.ItemDecoration() { 
    
    
        @Override 
        public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { 
         int totalHeight = parent.getHeight(); 
         int viewHeight = getResources().getDimensionPixelOffset(R.dimen.breadcrumb_btn_height); 
         int padding = (totalHeight - viewHeight)/2; 
         //to position view on middle 
         if (view.getTag() instanceof Integer) { 
          int position = (int) view.getTag(); 
          if (position == 0) { 
           //first position 
           outRect.set(padding, padding, 0, padding); 
          } else if (position == linearLayoutManager.getItemCount() - 1) { 
           //last position 
           outRect.set(0, padding, padding, padding); 
          } else { 
           outRect.set(0, padding, 0, padding); 
          } 
         } 
    
    
        } 
    }); 
    

    Qui ho

  • LinearLayoutManager con Horizontal Orientation

    sto aggiungendo position tag RecyclerView Adapter, nel modo seguente

    @Override 
    public void onBindViewHolder(BreadCrumbViewHolder holder, int position) { 
    holder.setPosition(position); 
    } 
    

    C'è un altro modo per accedere RecyclerView primo e l'ultimo bambino su ItemDecoration in modo che in seguito la rimozione e l'aggiunta di elementi non avrà alcun problema.

risposta

30

C'è un altro modo per accedere RecyclerView primo e l'ultimo bambino su ItemDecoration in modo che in seguito la rimozione e l'aggiunta di elementi non avrà alcun problema.

Sì. È possibile ottenere ciò che si desidera solo implementando il proprio ItemDecoration.

per ottenere la posizione oggetto/bambino corrente:

int position = parent.getChildAdapterPosition(view); 

Per ottenere il numero di elementi/Bambini:

int itemCount = state.getItemCount(); 

Con questo si può aggiungere un spazio sulla prima e l'ultima figlio del tuo RecyclerView.


Ora cambiare il codice per questo approccio si ottiene:

@Override 
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { 
    super.getItemOffsets(outRect, view, parent, state); 

    //your padding... 

    final int itemPosition = parent.getChildAdapterPosition(view); 
    if (itemPosition == RecyclerView.NO_POSITION) { 
     return; 
    } 

    final int itemCount = state.getItemCount(); 

    /** first position */ 
    if (itemPosition == 0) { 
     outRect.set(padding, padding, 0, padding); 
    } 
    /** last position */ 
    else if (itemCount > 0 && itemPosition == itemCount - 1) { 
     outRect.set(0, padding, padding, padding); 
    } 
    /** positions between first and last */ 
    else { 
     outRect.set(0, padding, 0, padding); 
    } 
} 

Bonus: Se stai cercando di dare padding a tutti gli elementi della RecyclerView dare un'occhiata al Gist Ho creato: https://gist.github.com/ryanamaral/93b5bd95412baf85a81a

+1

Uomo fantastico. Grazie. Non aggiungere 'parent.getChildPosition (view)' invece di 'parent.getChildAdapterPosition (view)' – laaptu

+0

@laaptu il metodo getChildPosition è stato deprecato. La documentazione dice di usare getChildAdapterPosition o getChildLayoutPosition. –

+1

In questo caso credo che dovresti usare 'getChildLayoutPosition (view)' in combinazione con 'state.getItemCount()', invece di 'getChildAdapterPosition (view)'. Rappresentano le posizioni nel passaggio del layout corrente, che può essere meno recente rispetto alle posizioni nell'adattatore. – BladeCoder

Problemi correlati