RecyclerView scrollToPosition de ne pas déclencher scrollListener
Je suis en utilisant RecyclerView, avec ScrollListener:
mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener()
{
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState)
{
super.onScrollStateChanged(recyclerView, newState);
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy)
{
super.onScrolled(recyclerView, dx, dy);
//Do my logic
}
});
Quand j'ai faites défiler avec le doigt, le défilement de l'auditeur déclenché amende.
Mais quand je scroll progrematically, comme ça:
mRecyclerView.scrollToPosition(LAST_POSITION);
Le défilement de l'auditeur n'est pas déclenché.
- En interne, il transmet l'appel à la disposition du gestionnaire. Directement essayez de faire défiler à l'aide de gestionnaire de présentation. Est-il défilement à la position attendue ?
- Oui,
mRecyclerView.scrollToPosition(LAST_POSITION)
défiler jusqu'à la position attendue, qu'entendez-vous par à l'aide de gestionnaire de mise en page?mRecyclerView.getLayoutManager().scrollToPosition(LAST_POSITION)
pas encore déclenché la ScrollListener
Vous devez vous connecter pour publier un commentaire.
C'est un problème connu. Elle est causée par le fait que RecyclerView ne sais pas comment LayoutManager va gérer le défilement ou si il va le traiter à tous.
Dans la prochaine version, vous recevrez un appel à
onScrolled
si le premier ou le dernier enfant des changements de position après une mise en page (ce qui est généralement le résultat de l'appel d'faites défiler jusqu'à la position).Malheureusement, dx et dy sera 0, car RecyclerView ne savent pas vraiment combien de layout manager ne faites défiler jusqu'à la poignée
scrollTo
demande. Alternativement, vous pouvez également utiliser le ViewTreeObserver de défilement de rappel.onLayout
appel.Recyclerview
. je conseille à l'aide d'unhandler
avec 1 secondedelay
à mettre en œuvre de défilement. C'est comment whatsApp semble le faire.J'ai été confronté au même problème et trouvé une solution de contournement, qui consiste à utiliser le smoothScrollToPosition dans le gestionnaire de configuration. Cette méthode déclenche le défilement de l'auditeur. Donc, fondamentalement, ce est ce que j'utilise pour avoir:
et maintenant que j'ai changé à ce:
et il fonctionne très bien pour moi.
C'est un peu rudimentaire, mais vous pouvez essayer de la présente sous-classe de RecyclerView:
Muito legal seu conselho.
Explicitement déclencher onScrollListener plus de recycler de l'utilisation de vue:
Je ne pouvais pas utiliser le smoothScrollToPosition (nous avons eu quelques problèmes avec elle dans le passé) et en fonction de la position du premier élément semble peu fiable, donc j'ai fini par utiliser yigit's réponse (il a été publié déjà), malheureusement il ne fonctionne pas toujours (je ne sais pas pourquoi).
Donc j'ai fini par utiliser un parchemin auditeur, j'ai ajouté précédemment à la RecyclerView, malheureusement je ne trouve pas l'origine de cette solution.
Je ne pense pas que vous devriez utiliser cette écoute si vous avez besoin d'un qui est toujours là, heureusement que j'ai besoin d'écouter seulement à des moments précis.
Remplacer la RecyclerView:
Utilisation:
Veuillez essayer avec
LayoutManager.scrollToPosition()
ne peut pas bien fonctionner, maisLinearLayoutManager.scrollToPositionWithOffset()
fonctionne. Et similarlly GridLayoutManager ainsi.Ou nous devons écrire notre mode de mise en œuvre, car RecyclerView ne sais pas comment LayoutManager fait défiler la vue.
Parfois cela fait l'affaire