Android TV RecyclerView focus interaction
j'utilise actuellement un normal RecyclerView
avec GridLayoutManager
avec un différent spanCount
dépendant du viewType
pour une application Android TV. Tout fonctionne bien mais j'ai 2 problèmes:
- si vous appuyez longtemps sur le dpad vers le bas pour faire défiler rapidement entre les éléments parfois la mise au point est perdue à une vue qui n'est pas un enfant de la RecyclerView.
- Comment puis-je dire au
RecyclerView
de garder la vue concentrée actuelle dans le centre de la grille?
il semble que les problèmes énumérés soient résolus en utilisant la bibliothèque VerticalGridView
de LeanBack
mais le LayoutManger
qu'il utilise est interne et ne supporte pas spanCount
.
3 réponses
Recycler view fonctionne bien avec android TV.Les solutions possibles que vous pouvez inclure sont:
1.ajouter focusable et focusableInTouchode à vue.Ajoutez focusListner à travers le code et demandez focus à chaque fois que la vue est cliquée.
2.Pour garder la vue de Recycler point focalisé dans le centre vous devez Outrepasser le layout manager juste comme cet exemple.
RecyclerView smoothScroll en position centrale. Android
ou
utiliser layoutManager.scrollToPositionWithOffset (position,offset) où la position et l'offset de la vue centrée sur la position est la largeur de la vue du recycleur/2.
vous pouvez essayer de vérifier ce solution de contournement pour le bug avec RecycleView
focus scrolling lors de la navigation avec d-pad.
voici le alors question pour cela.
le problème ici, c'est que le GridLayoutManager
utilise LinearLayoutManager
de la mise en œuvre de onFocusSearchFailed()
qui s'appelle lorsque focus approche de la frontière interne de RecyclerView
. LinearLayoutManager's
mise en œuvre juste offre l'élément premier/dernier (dépend de la direction du défilement). Par conséquent, focus saute au premier/dernier élément de la nouvelle rangée.
alors, peut-être que cette solution résoudra votre problème ou vous donnera une idée sur la façon de résoudre votre problème.
-
pour un recyclage régulier, j'ai dû préciser:
android: descentfocusability= "beforeDescendants"
aussi android:nextFocusDown="@+id/recyclerviewId " est réglé pour envoyer le focus à RV lui-même.
- la seule solution que je vois est un écouteur clé pour sélectionner item to position currentPosition+spancount.