2015-08-27 16 views
19

Mam widok recyklera ... i chcę płynnego przewijania, a następnie scrollup do niego programowo, aby pokazać pełną zawartość w nim użytkownikowi .... i iM w stanie to zrobić przezJak kontrolować szybkość przewijania recyclerView.smoothScrollToPosition (position)

final int height=recyclerView.getChildAt(0).getHeight(); 
    recyclerView.smoothScrollToPosition(height); 
    recyclerView.postDelayed(new Runnable() { 
     public void run() { 
      recyclerView.smoothScrollToPosition(0); 
         } 
    },200); 

ale co chcę ... spowolnić szybkość przewijania tak, że pełna treść uzyskać widoczną clearlly.So, może ktoś mi pomóc szukać go. Thxs ...

+0

Witam, staram się zrobić to samo. Czy kiedykolwiek osiągnąłeś rozwiązanie? Dziękuję Ci. @Dipika –

+0

hej JayS ... Nie, jeszcze nie znalazłem żadnego rozwiązania. – Dipika

Odpowiedz

44

Wystarczy poprawić odpowiedź na krótko:

public class SpeedyLinearLayoutManager extends LinearLayoutManager { 

    private static final float MILLISECONDS_PER_INCH = 5f; //default is 25f (bigger = slower) 

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

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

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

    @Override 
    public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) { 

     final LinearSmoothScroller linearSmoothScroller = new LinearSmoothScroller(recyclerView.getContext()) { 

      @Override 
      public PointF computeScrollVectorForPosition(int targetPosition) { 
       return SpeedyLinearLayoutManager.this.computeScrollVectorForPosition(targetPosition); 
      } 

      @Override 
      protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) { 
       return MILLISECONDS_PER_INCH/displayMetrics.densityDpi; 
      } 
     }; 

     linearSmoothScroller.setTargetPosition(position); 
     startSmoothScroll(linearSmoothScroller); 
    } 
} 
12

Znalazłem odpowiedź!

Należy utworzyć niestandardową klasę rozszerzającą [LinearLayoutManager][1], a następnie przesłonić metodę [smoothScrollToPosition][1]. Wewnątrz musisz utworzyć nowy [LinearSmoothScroller][1] i zastąpić jego metodę calculateSpeedPerPixel. Następnie użyj tego LinearSmoothScroller, aby zakończyć przewijanie.

Oto mój przykład:

public class CustomLinearLayoutManager extends LinearLayoutManager{ 
     @Override 
     public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) { 
      final LinearSmoothScroller linearSmoothScroller = 
        new LinearSmoothScroller(recyclerView.getContext()) { 
         private static final float MILLISECONDS_PER_INCH = 100f; 

         @Override 
         public PointF computeScrollVectorForPosition(int targetPosition) { 
          return CustomLinearLayoutManager.this 
           .computeScrollVectorForPosition(targetPosition); 
        } 

        @Override 
        protected float calculateSpeedPerPixel 
          (DisplayMetrics displayMetrics) { 
         return MILLISECONDS_PER_INCH/displayMetrics.densityDpi; 
        } 
       }; 
     linearSmoothScroller.setTargetPosition(position); 
     startSmoothScroll(linearSmoothScroller); 
    } 
} 

przypisać ten CustomLinearLayoutManager do RecyclerView i powinno być dobrze iść. Daj mi znać, jeśli nic nie wiem. Chętnie pomogę.

+0

hej @Jay S, czy możesz mi powiedzieć jaka jest minimalna wersja SDK, której używasz. Ponieważ używam tylko 15 z biblioteką wsparcia appcompat-v7: 22.2.0, a klasa SnappyLinearLayoutManager nie jest dostępna. – Dipika

+0

Dziękuję. To działało dla mnie. – viper

2

Zrobiłem wersję, że można ustawić zmienną szybkość przewijania.

Jeśli ustawisz factor na 2, będzie to dwa razy wolniej niż domyślnie.

public class VariableScrollSpeedLinearLayoutManager extends LinearLayoutManager { 

    private final float factor; 

    public VariableScrollSpeedLinearLayoutManager(Context context, float factor) { 
     super(context); 
     this.factor = factor; 
    } 

    @Override 
    public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) { 

     final LinearSmoothScroller linearSmoothScroller = new LinearSmoothScroller(recyclerView.getContext()) { 

      @Override 
      public PointF computeScrollVectorForPosition(int targetPosition) { 
       return VariableScrollSpeedLinearLayoutManager.this.computeScrollVectorForPosition(targetPosition); 
      } 

      @Override 
      protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) { 
       return super.calculateSpeedPerPixel(displayMetrics) * factor; 
      } 
     }; 

     linearSmoothScroller.setTargetPosition(position); 
     startSmoothScroll(linearSmoothScroller); 
    } 
} 
0

znalazłem skomplikowane rozwiązanie dla tej kwestii możemy wykorzystać CountDownTimer, że to działa ...

new CountDownTimer(1000, 1000) { 
     public void onTick(long millisUntilFinished) { 
     } 
     public void onFinish() { 

      recyclerViewSelectionTest.scrollToPosition(position + 1); 
     } 
    }.start(); 

ten kod wykonane jedno sekundowe opóźnienie do recyklera

1

Dla tych niezainteresowani nadpisując LinearLayoutManager (lub dowolną podklasę, której używasz), możesz po prostu zadzwonić pod numer startSmoothScroll(smoothScroller) bezpośrednio w menedżerze układu.

+0

Jak ustawić tutaj, aby na przykład wygładzić przewijanie do pozycji w ciągu jednej sekundy? –

+0

Nie ma prostego rozwiązania. Problem polega na tym, że widok recyklera nie wie, jak daleko znajduje się pozycja, więc LinearSmoothScroll po prostu wykonuje zwoje w ogólnym kierunku, w którym znajduje się widok, a następnie zwalnia po wyświetleniu widoku na ekranie. Musiałbyś napisać kilka dodatkowych struktur, aby zrobić to samemu. –

+0

Co jeśli wszystkie komórki mają ten sam rozmiar (lub mam średni rozmiar lub szacowany jeden ze wszystkich) i oczywiście wiem, ile komórek jest przed sobą? –

Powiązane problemy