2016-08-27 12 views
9

Próbuję zaimplementować pewien rodzaj wyboru koła dla mojej aplikacji, ponieważ obecne opcje polegają na niestandardowym Views lub starym ListView, więc chciałbym oprzeć moje rozwiązanie na RecyclerView.Wyśrodkowo zaznaczony element w RecyclerView

co zrobiłem do tej pory było ustalone na początku i na końcu RecyclerView dwa View z innego typu, o nazwie PADDING_TYPE tak, że pierwszy i ostatni element są pionowo w środku RecyclerView.

recyclerView.post(new Runnable() { 
    @Override 
    public void run() { 
     //80dp is the height of a regular list item 
     int paddingHeight = ((recyclerView.getHeight()-SettingsManager.dptopixels(80))/2); 
     binding.getRoot().getLayoutParams().height = paddingHeight; 
    } 
}); 

Teraz próbuję zrozumieć, jak zachować wybrany element pionowo w środku.

Co próbowałem dotąd:

1- LinearSnapHelper

LinearSnapHelper helper = new LinearSnapHelper(); 
helper.attachToRecyclerView(mRecyclerView); 

nie działa zgodnie z oczekiwaniami, próbowałem też przesłonić kilka metod (prawdopodobnie w niewłaściwy sposób), ale mogę powoduje automatyczne wyśrodkowanie zaznaczenia w pionie. I nie jest wystarczająco sprytny, wybrany element "porusza się", zamiast być zablokowany na pionowym środku.

2- klienta RecyclerView.OnScrollListener

starałem się dostosować kod zaproponowany here, który jest dla przewijania w poziomie, poprzez zmianę w RecyclerView.OnScrollListener tę linię

allPixelsDate += dx; 

z pionowym różnicy przewijania:

allPixelsDate += dy; 

Ta implementacja n jest blisko pracy, ponieważ wybiera najbliższy element do pionowego środka listy, ale bez blokowania go do środka.

Czy można osiągnąć taki wynik? W jaki sposób?

Aby było bardziej zrozumiałe: Chciałbym osiągnąć wynik pokazany here o 1:10. Wybór jest "zablokowany" w środku.

+0

spróbuj tego kodu w celu odniesienia [link] (http://developer.samsung.com/s-pen-sdk/samples/Circle-Launcher) – Moinkhan

+0

Zrobiłem to za pomocą https://github.com/ai212983/ android-spinnerwheel i myślę, że potrzebujesz tego w pionie Mannner https://github.com/Jaouan/Carousel-Browsing-Eample, – Nepster

+0

możesz użyć tej metody w pionie, aby to osiągnąć [otwórz to] (http://stackoverflow.com/a/38411582/2587027) – wadali

Odpowiedz

10

Wystarczy użyć LinearSnapHelper i metody setOnFlingListener (snapHelper) w swoim RecyclerView.

ta jest przykładem pracy:

LinearSnapHelper snapHelper = new LinearSnapHelper(); 
snapHelper.attachToRecyclerView(recyclerView); 
recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); 
recyclerView.setOnFlingListener(snapHelper); 

Aby uzyskać prawdziwy próbnik koło będzie trzeba także dodać trochę skórę za kierownicą i dokładnie obliczyć wysokość wierszy i wysokość RecyclerView. Na przykład, jeśli chcesz wyświetlić tylko 3 rzędy koła, potrzebujesz wysokości okna RecyclerView, która będzie 3 razy większa niż wysokość wiersza.

+1

Próbowałem podejścia, które zasugerowałeś i wygląda na to, że zachowuje się tak samo jak w moim numerze próby ** 1 **. Próbuję osiągnąć usunięcie efektu przewijania: zawartość wierszy powinna być aktualizowana poprzez przewijanie, ale wiersze nie powinny się poruszać, w taki sposób, aby zaznaczenie było "zablokowane" i wyśrodkowane w pionie. Z 'LinearSnapHelper' to po prostu regularnie przewija i próbuje - słabo - aby przyciągnąć środkowe dziecko do centrum jego rodzica (" RecyclerView "). Aby lepiej zrozumieć, o co mi chodzi, patrz https://www.youtube.com/watch?v=rercnPOELvs pod adresem 1:10 – Vektor88

+0

@ Vektor88 Jak chcesz, aby użytkownik zmieniał wybrany element? Rzucać, czy nie? – lobzik

+0

Tak, spójrz na wideo. Chcę, żeby fling spowodował tylko aktualizację wierszy i brak ruchu przewijania. – Vektor88

Powiązane problemy