2016-07-16 15 views
7

ich benutze horizontale Layout-Manager für meine RecyclerView. Ich muss RecyclerView auf die nächste Art machen: wenn Sie auf einen Artikel klicken - machen Sie SmoothScrool an diese Position und setzen Sie den Artikel in die Mitte von recyclerView (wenn es möglich ist, zum Beispiel 10 Artikel von 20).RecyclerView smoothScroll zur Positionierung in der Mitte. android

so habe ich kein problem mit smoothScrollToPosition, aber wie man ein Element als in der Mitte von RecyclerView ???

danke!

Antwort

35

Ja, es ist möglich

Durch Arbeitsgeräte RecyclerView.SmoothScroller Methode '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); 

Speziell in LinearLayoutManager mit 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); 
     } 
    } 
} 

Gut Glück

+2

perfekt, dank – AnswerZhao

+1

'erweitert LinearSmoothScroller' außer Kraft setzen muss 'computeScrollVectorForPosition()' – Ninja

+0

Arbeitete fehlerlos –