2016-07-16 140 views
7

sto usando il gestore di layout orizzontale per il mio recyclerView. Ho bisogno di rendere recyclerView in un prossimo modo: quando clicchi su qualche oggetto - rendi smoothScrool in quella posizione e metti l'oggetto tat nel centro di recyclerView (se possibile, per esempio 10 item da 20).RecyclerView smoothScroll per posizionarsi al centro. android

quindi non ho problemi con smoothScrollToPosition, ma come mettere l'articolo rispetto al centro di RecyclerView ???

grazie!

risposta

35

sì è possibile

Con implementa il metodo di RecyclerView.SmoothScroller 'onTargetFound'.

/** 
* Called when the target position is laid out. This is the last callback SmoothScroller 
* will receive and it should update the provided {@link Action} to define the scroll 
* details towards the target view. 
* @param targetView The view element which render the target position. 
* @param state   Transient state of RecyclerView 
* @param action  Action instance that you should update to define final scroll action 
*      towards the targetView 
*/ 
abstract protected void onTargetFound(View targetView, State state, Action action); 

Specialmente in LinearLayoutManager con LinearSmoothScroller

public class CenterLayoutManager extends LinearLayoutManager { 

    public CenterLayoutManager(Context context) { 
     super(context); 
    } 

    public CenterLayoutManager(Context context, int orientation, boolean reverseLayout) { 
     super(context, orientation, reverseLayout); 
    } 

    public CenterLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 
     super(context, attrs, defStyleAttr, defStyleRes); 
    } 

    @Override 
    public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) { 
     RecyclerView.SmoothScroller smoothScroller = new CenterSmoothScroller(recyclerView.getContext()); 
     smoothScroller.setTargetPosition(position); 
     startSmoothScroll(smoothScroller); 
    } 

    private static class CenterSmoothScroller extends LinearSmoothScroller { 

     CenterSmoothScroller(Context context) { 
      super(context); 
     } 

     @Override 
     public int calculateDtToFit(int viewStart, int viewEnd, int boxStart, int boxEnd, int snapPreference) { 
      return (boxStart + (boxEnd - boxStart)/2) - (viewStart + (viewEnd - viewStart)/2); 
     } 
    } 
} 

Buone fortunati

+2

perfetti, grazie – AnswerZhao

+1

'estende LinearSmoothScroller' deve avere la priorità 'computeScrollVectorForPosition()' – Ninja

+0

lavorato impeccabile –

Problemi correlati