10

OK! Próbowałem to zrobić przez ostatnie kilka tygodni i nie mogę znaleźć dobrego rozwiązania, w jaki sposób mogę osiągnąć to, co chcę. Próbowałem z HorizontalScrollView, Galeria (która jest przestarzała).W jaki sposób można utworzyć poziomą listę przewijania z efektem przyciągania do centrum

Teraz zajmuję się RecycleView, ponieważ znalazłem tę metodę .smoothScrollToPosition() i myśl, która może mi pomóc.

Oto ilustracja tego, co chcę osiągnąć:

enter image description here

Mam również, aby móc stworzyć relativelayouts programowo

Czy ktoś może wskazać mi w jaki sposób można to osiągnąć ? Czy jest jakiś natywny sposób na zrobienie tego?

EDYCJA: Po zapoznaniu się z sugestią @CommonsWare na temat przeglądania ViewPagera i commonsware.com/blog/2012/08/20/ trzeciego postu od Dave'a Smitha, myślę, że to jest droga. Nie zmodyfikowałem go jeszcze do mojego użytku, ale wygląda dobrze.

Używam Dave Smiths próbki z jego Github: https://gist.github.com/devunwired/8cbe094bb7a783e37ad1

+3

'ViewPager' może być używany do tego, w zależności od celów: https://commonsware.com/blog/2012/08/20/multiple-view-viewpager-options.html Zobacz w szczególności trzecią opcję, od Dave Smith, w tym poście. – CommonsWare

+0

To może być dokładnie to, czego szukam. –

Odpowiedz

4

Nie używaj tego podejścia, używa się dużo pamięci (jeśli w pewnym momencie trzeba rozszerzyć na bardziej ogólne rozwiązanie) bo ciebie będzie musiał zachować w pamięci liczbę stron o numerze ViewPager (Fragment). Miałem to samo wyzwanie i osiągnąłem to z HorizontalListView.

Więc trzeba stworzyć Adapter która doda „odcinki” View JEST W celu uzyskania pierwszy lub ostatni (może być więcej w zależności od pożądanych widocznych poglądów w tym samym czasie) w środku ekranu ponieważ jest to ListView. Dla efektu zatrzaskiwania można użyć mniej więcej tak (wszystkie elementy muszą mieć jednakowe wymiary):

View.OnTouchListener hListViewsOnTouchListener = new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       if (event.getAction() == MotionEvent.ACTION_UP && v instanceof HListView) { 
        View c = ((HListView) v).getChildAt(0); 
        int posToGo = Math.abs(c.getX()) < c.getWidth()/2 ? ((HListView) v).getFirstVisiblePosition() : ((HListView) v).getFirstVisiblePosition() + 1; 
        ((HListView) v).smoothScrollToPositionFromLeft(posToGo, 0); 
       } 
       return false; 
      } 
     }; 

Takie podejście nie tylko zużywa mniej pamięci, ale to generic dotyczące liczby widoków podrzędnych, to jest gładsza i cały elementy są klikalne (nie tylko skupia jeden) ... no to ListView :)
Oto zrzut ekranu końcowego Przykâadowa:
enter image description here enter image description here enter image description here

Tak e care.

+0

Nie masz kodu samplera, którego mógłbym użyć? –

+0

https://play.google.com/store/apps/details?id=me.mesmo.app – GuilhE

+0

Przy okazji. Link, który podałeś do HorizontalListView, jest już uznany za przestarzały. –