Czy można ustawić ListView
poziomo? Zrobiłem to za pomocą widoku galerii, ale wybrany element automatycznie pojawia się na środku ekranu. Nie chcę wybranego elementu w tym samym miejscu, w którym kliknąłem. Jak mogę rozwiązać ten problem? Moim pomysłem było ustawienie ListView
z przewijaniem poziomym. Podziel się swoim pomysłem?
android
listview
gallery
horizontal-scrolling
Praveen
źródło
źródło
Odpowiedzi:
Zgodnie z dokumentacją dla systemu Android
RecyclerView
to nowy sposób organizowania elementów w widoku listy i wyświetlania w poziomieZalety:
Więcej informacji o
RecyclerView
:Próba:
survivingwithandroid.com
Wystarczy dodać poniższy blok, aby ustawić
ListView
poziomo od pionuFragment kodu
źródło
Paul nie zadaje sobie trudu naprawiania błędów w swojej bibliotece ani przyjmowania poprawek użytkowników. Dlatego sugeruję inną bibliotekę, która ma podobną funkcjonalność:
https://github.com/sephiroth74/HorizontalVariableListView
Aktualizacja : 24 lipca 2013 r. Autor (sephiroth74) wydał całkowicie przepisaną wersję opartą na kodzie Androida 4.2.2 ListView. Muszę powiedzieć, że nie ma wszystkich błędów, które miała poprzednia wersja i działa świetnie!
źródło
@Paul answer prowadzi do świetnego rozwiązania, ale kod nie pozwala na użycie onClickListeners na elementach potomnych (funkcje zwrotne nigdy nie są wywoływane). Od jakiegoś czasu staram się znaleźć rozwiązanie i postanowiłem opublikować tutaj, co należy zmodyfikować w tym kodzie (na wypadek, gdyby ktoś tego potrzebował).
Zamiast
dispatchTouchEvent
zastępowania zastąpieniaonTouchEvent
. Użyj tego samego kodudispatchTouchEvent
i usuń metodę (różnicę można odczytać tutaj http://developer.android.com/guide/topics/ui/ui-events.html#EventHandlers )Następnie dodaj następujący kod, który podejmie decyzję o kradzieży zdarzenia z elementu potomnego przedmiotu i przekazaniu go naszemu
onTouchEvent
, lub pozwoleniu, aby je obsłużyli.Na koniec nie zapomnij zadeklarować zmiennych w swojej klasie:
źródło
Ponieważ Google wprowadziło Android Support Library v7 21.0.0, możesz używać RecyclerView do przewijania elementów w poziomie. Widżet RecyclerView to bardziej zaawansowana i elastyczna wersja ListView.
Aby użyć RecyclerView, po prostu dodaj zależność:
Oto próbka:
Więcej informacji o RecyclerView:
źródło
Jest trochę (bardzo) późno, ale publikuję to na wypadek, gdyby ktoś przyszedł później.
Biblioteka pomocy technicznej w wersji zapoznawczej Androida L ma
RecyclerView
dokładnie to, co chcesz.W tej chwili możesz uzyskać to tylko za pomocą L Preview SDK i musisz ustawić
minSdk
naL
. Ale możesz skopiować wszystkie niezbędne pliki do swojego projektu i używać ich w ten sposób, dopóki L nie zostanie oficjalnie wydany.Dokumenty z podglądem możesz pobrać tutaj .
Ostrzeżenie: interfejs API dla Recycler View może ulec zmianie i może zawierać błędy.
Zaktualizowano
Kod źródłowy poziomego widoku listy to:
źródło
LinearLayoutManager
- patrz tutaj: stackoverflow.com/questions/28460300/…Pobierz plik jar stąd
teraz umieść go w folderze libs, kliknij go prawym przyciskiem myszy i wybierz „Dodaj jako bibliotekę”
teraz w main.xml umieść ten kod
teraz w klasie Activity, jeśli chcesz mieć poziomy widok listy z obrazkami, umieść ten kod
źródło
To jest naprawdę bardzo proste : wystarczy obrócić widok listy, aby położyć się na boku
mlistView.setRotation(-90);
Następnie po napompowaniu dzieci powinno to znajdować się w metodzie getView. obracasz dzieci, aby powstały prosto:
Edycja: jeśli twój ListView nie pasuje poprawnie po obrocie, umieść ListView wewnątrz tego RotateLayout w następujący sposób:
źródło
Moim rozwiązaniem jest po prostu użycie
ViewPager
widgetu. Nie jest centralnie zablokowany jakoGallery
i ma wbudowane funkcje recyklingu widoków (asListView
). Podobne podejście możesz zobaczyć w aplikacji Google Play, ilekroć masz do czynienia z listami przewijanymi poziomo.Musisz tylko rozszerzyć
PagerAdapter
i wykonać kilka drobnych poprawek:W rezultacie będziesz mieć poziomo przewijany widget z adapterem, taki jak ten:
źródło
Uwaga: Android obsługuje teraz poziome widoki listy za pomocą RecyclerView, więc teraz ta odpowiedź jest przestarzała, aby uzyskać informacje o RecyclerView: https://developer.android.com/reference/android/support/v7/widget/RecyclerView
Opracowałem logikę, aby to zrobić bez użycia zewnętrznej biblioteki poziomego przewijania, oto widok poziomy, który osiągnąłem i opublikowałem tutaj swoją odpowiedź: https://stackoverflow.com/a/33301582/5479863
Moja odpowiedź JSON jest taka:
Plik układu:
plik klasy:
sztuczka, która tu działa, to identyfikator, który przypisałem do ImageView „imgView.setId (v)”, a następnie zastosowanie onClickListener do tego, że ponownie pobieram identyfikator widoku .... Skomentowałem również wewnątrz kodu, więc że łatwo to zrozumieć, mam nadzieję, że to może być bardzo przydatne ... Happy Coding ... :)
źródło
getPixelsToDP()
?To nie jest duża odpowiedź, ale co powiesz na użycie poziomego widoku przewijania ?
źródło
Możesz użyć RecyclerView w bibliotece wsparcia. RecyclerView to uogólniona wersja ListView, która obsługuje:
Recykler na Androida Wyświetl dokumenty
źródło
Dużo szukałem rozwiązania tego problemu. Krótka odpowiedź brzmi: nie ma dobrego rozwiązania bez zastąpienia prywatnych metod i tym podobnych rzeczy. Najlepszą rzeczą, jaką znalazłem, było wdrożenie go od zera poprzez rozszerzenie
AdapterView
. To dość nieszczęśliwe. Zobacz moje SO pytanie dotyczące poziomych widoków list .źródło
fillListDown()
metodzie musisz śledzić dolną krawędź ostatniego elementu listy. Ale nie wiesz, gdzie jest ta krawędź, dopóki nie utworzysz ostatniego elementu (adapter.getCount () - 1). Poczekaj, aż ten element zostanie utworzony, a następnie możesz zapisać lokalizację krawędzi. Gdy już to wiesz, możesz upewnić się, że mListTop nigdy nie jest mniejszy niż 0 i nigdy wyższy niż wysokość listy.Musiałem zrobić to samo w przypadku jednego z moich projektów i skończyło się również pisaniem własnego. Nazwałem toNazwałem HorzListView jest teraz częścią mojej otwartej biblioteki Aniqroid .
http://aniqroid.sileria.com/doc/api/ (poszukaj plików do pobrania na dole lub użyj projektu kodu Google, aby wyświetlić więcej opcji pobierania: http://code.google.com/p/aniqroid/downloads/list )
Dokumentacja zajęć znajduje się tutaj: http://aniqroid.sileria.com/doc/api/com/sileria/android/view/HorzListView.html
źródło
Do mojej aplikacji używam HorizontalScrollView zawierającego LinearLayout wewnątrz, który ma orientację ustawioną na poziomą. Aby dodać obrazy do wewnątrz, tworzę ImageViews wewnątrz działania i dodaję je do mojego LinearLayout. Na przykład:
To działa dla mnie idealnie. W ćwiczeniu wszystko, co muszę zrobić, to coś w rodzaju kodu poniżej:
Jak powiedziałem, to działa dla mnie i mam nadzieję, że pomoże to również komuś, kto chce to osiągnąć.
źródło
cóż, zawsze możesz dynamicznie tworzyć swoje widoki tekstowe itp. i ustawiać onclicklisteners tak, jak zrobiłbyś to z adapterem
źródło
HorizontialListView nie może działać, gdy dane w adapterze są zaangażowane w inny wątek. Wszystko działa w 100% na wątku interfejsu użytkownika. Jest to duży problem w przypadku wielowątkowości. Myślę, że przy użyciu HorizontialListView nie jest najlepszym rozwiązaniem dla problem.HorzListView jest lepszym way.You prostu zastąpić poprzednią galeria z HorzListView.You neednot zmodyfikować kod o adapter.Then wszystko idzie tak, jak hope.See https: // stackoverflow.com/a/12339708/1525777 o HorzListView.
źródło
Użyłem poziomego linku widoku listy w moim projekcie i uzyskałem dobre wyniki. Początkowo korzystałem z biblioteki devsmart, ale dało mi to pewne problemy. Więc najlepszy sposób na użycie poziomego linku do widoku listy, gdy udało mi się odzyskać moje problemy, a także niedawno uruchomiłem aplikację w Google PlayStore przy użyciu tej biblioteki i otrzymałem dobrą odpowiedź od użytkowników. Polecam więc korzystanie z tej samej biblioteki, o której wspomniałem powyżej, do wyświetlania widoku listy w poziomie. Cieszyć się :)
źródło
Jest na to świetna biblioteka, o nazwie TwoWayView , jest bardzo łatwa do wdrożenia, po prostu włącz bibliotekę projektów do swojego miejsca pracy i dodaj ją jako projekt biblioteki do oryginalnego projektu, a następnie wykonaj następujące kroki, które zostały pierwotnie wymienione tutaj :
Następnie,
i na koniec, po prostu to zadeklaruj i postępuj z nim jak ze zwykłym
ListView
:Wszystkie metody
ListView
będą działać tutaj jak zwykle, ale zauważyłem tylko jedną różnicę, która polega na tym, że przy ustawianiu trybu wyboru metodasetChoiceMode
nie przyjmujeint
wartości, ale wartość zenum
wywołanejChoiceMode
, więc taklist_view.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
będzielvTest.setChoiceMode(ChoiceMode.SINGLE); // or MULTIPLE or NONE
.źródło
Możesz użyć ViewFlipper, aby dołączyć XML układu i dodać obrazy, widok listy dla każdego XML układu
źródło