2016-08-31 53 views
23

Obecnie używam standardowego RecyclerView z GridLayoutManager z innym spanCount deprymującym na viewType dla aplikacji Android TV. Wszystko działa dobrze, ale mam 2 problemy:Urządzenie Android TV Recycler View interakcja między obiektami

  1. Jeśli długo naciskasz dpad w dół, aby szybko przewijać pozycje, czasami ostrość jest tracona z widokiem, który nie jest dzieckiem z RecyclerView.
  2. Jak mogę powiedzieć, że RecyclerView utrzymuje bieżący, skupiony widok w środku siatki?

Wydaje się, że kwestie wymienione są mocowane za pomocą VerticalGridView z LeanBack biblioteki ale LayoutManger że wykorzystuje to wewnętrzny i nie obsługuje spanCount.

+0

Odpowiedzi na pierwsze pytanie proszę spojrzeć na [post] (https: // stackoverflow.com/a/48309162/4770877) – yoAlex5

Odpowiedz

1

widok Recycler współpracuje z Androidem rozwiązań TV.Possible można dołączyć to:

1.Add aktywowana i focusableInTouchode do view.Add focusListner poprzez kod i poprosić skupić za każdym razem, gdy widok jest kliknięty.

2. Aby zachować skoncentrowany przedmiot Recycler View w centrum, należy zastąpić menedżera układu, tak jak w tym przykładzie.

RecyclerView smoothScroll to position in the center. android

lub

zastosowanie layoutManager.scrollToPositionWithOffset (położenie, offset), w którym położenie zorientowane położenie widzenia, a przesunięcie to szerokość widok recyklingowa/2.

+0

Dzięki za odpowiedź. W końcu użyłem 'VerticalGridView' z biblioteki Leanback, ale wygląda na to, że twoje rozwiązanie powinno działać. –

+0

Twój najbardziej mile widziany. VerticalGridView lub rozszerzenie RowFragment może również pozwolić Ci osiągnąć ten sam efekt, co widok recyklingu, ale wadą jest to, że nie możesz go dostosować tak, jak chcesz. – Anonymous

0

Możesz spróbować sprawdzić to workaround dla bug z RecycleView przewijaniem fokusa podczas nawigacji z D-padem.

Oto numer SO question.

Problem polega na tym, że GridLayoutManager wykorzystuje implementację LinearLayoutManager „s onFocusSearchFailed() która jest wywoływana, gdy zbliża się skupić wewnętrzną granicę RecyclerView. LinearLayoutManager's implementacja oferuje tylko pierwszy/ostatni element (w zależności od kierunku przewijania). Stąd fokus przeskakuje do pierwszego/ostatniego elementu nowego wiersza.

Może to obejście rozwiąże problem lub da pojęcie o tym, jak rozwiązać problem.

+0

Dziękuję za odpowiedź, ale przeczytałem o tych odpowiedziach. 'v24.2.0', którego używam, przeskakuje do właściwej kolumny, jeśli przewiniesz w dół. Główne dwa problemy, które mam, to: 1) Potrzebuję nowego, skupionego widoku, aby był wyśrodkowany na liście (teraz, gdy przewijasz, menedżer układu tworzy nowy widok i przewija, aby był w pełni widoczny, ale potrzebuję go wyśrodkowany w widoku RecyclerView). 2) Jeśli przewijasz się bardzo szybko, fokus przeskakuje do widoku na górze RecyclerView, jeśli menedżer układu nie znajdzie wystarczająco szybkiego widoku (lub nie jestem do końca pewien, dlaczego tak się dzieje). –

+0

"VerticalGridView" z Leanback'a wydaje się rozwiązywać moje problemy, ale niestety ten menedżer layoutów, którego używa, jest chroniony pakietowo (nie mam dostępu do niczego na ten temat, mogę skopiować kod źródłowy, ale nie podoba mi się ten pomysł) + nie obsługuje 'setSpanSizeLookup'. Jedynym sposobem użycia go jest 'ListView' + a komórka' GridLayout', więc wygląda jak siatka. Implementacja wydaje się działać dobrze, ale proszę o inne, bardziej eleganckie rozwiązanie (lub niestandardowe). Nie udało mi się znaleźć żadnych bibliotek/leadów do tego. –

+0

Inną opcją, której obecnie używam, jest A-DPad Aware Recycler View stąd. Radzi sobie całkiem dobrze, ale przycinanie przycisków nie jest tak dobre, jak z bibliotek Leanback, ale jest open source i możesz go modyfikować i wnosić do niego. https://github.com/vganin/dpad-aware-recycler-view – kingargyle

0
  1. Dla zwykłego RecyclerView, musiałem podać:

    android: descendantFocusability = "beforeDescendants"

również android: nextFocusDown = "@ + id/recyclerviewId" jest ustawiony na wyślij fokus do samego RV.

  1. Jedyne rozwiązanie, jakie widzę, to kluczowy element nasłuchujący, który wybiera pozycję do położenia bieżąca pozycja + spankount.