2016-09-03 1 views
6

Existe-t-il un moyen de faire défiler jusqu'à la fin du recyclage en utilisant Espresso?Espresso: Recyclerview défiler jusqu'à la fin

Il y a un élément avec du texte, disons 'Texte XYZ' et le recyclerview a un identifiant recycleur. Cet élément s'avère être le dernier élément de la vue recycleur.

J'ai essayé

onView(withId(R.id.recycler_view)).check(matches(isDisplayed())).perform(RecyclerViewActions.scrollTo(withText("Text XYZ")),click()); 

Mais cela ne semble pas fonctionner. Des idées?

+0

ne semble pas fonctionner - journal des erreurs s'il vous plaît – piotrek1543

+0

vous vérifiez que l'affichage est affiché avant de faire défiler vers elle. – denys

+0

@denys Le ckeck est pour le recyclage réel. Cela ne devrait faire aucune différence, à moins que le reclassement ne soit pas réellement affiché. –

Répondre

13

RecyclerViewActions.scrollTo() matchs contre la ItemView du ViewHolder, qui est gonflé dans onCreateViewHolder() de l'adaptateur. Et pour que le scrollTo() fonctionne, vous devez fournir un comparateur qui identifie de façon unique le ItemView.

Votre comparateur actuel indique à espresso de faire défiler jusqu'à un ViewHolder qui a été gonflé avec un TextView en tant que itemView. Ce qui peut arriver, mais généralement vous avez une action ViewGroup pour styler les porte-vues de la façon dont vous voulez les voir.

Si vous modifiez votre scrollTo() Matcher, à hasDescendant(withText("Text XYZ")) pour prendre en compte toutes les mises en page imbriquées (s'il y en a plusieurs).

Gardez à l'esprit puisque vous essayez aussi de cliquer sur l'élément - vous ne pouvez pas le faire dans le même perform() car il envoie le clic au ViewInteraction actuel, qui est dans ce cas un RecyclerView avec id R.id.recycler_view. En procédant de la même manière, il suffit de cliquer au milieu sur le RecyclerView, pas l'élément que vous avez fait défiler.

Pour résoudre ce problème, vous devez soit avoir besoin d'un autre onView() avec le comparateur que vous avez utilisé pour faire défiler vers un élément, soit utiliser RecyclerView.actionOnItem().

Dans le cas d'une autre déclaration onView(), la hasDescendant(withText("Text XYZ")) va vous échouez, car il trouvera tous les parents de ce TextView (viewholder, recyclerview, le viewgroup qui détient le recyclerview et ainsi de suite) car ils ont tous ce descendant particulier. Cela vous forcera à rendre le matcher ItemView plus précis et prendre en compte toutes les mises en page imbriquées. Mon habitude aller à matcher est withChild() dans ces situations, mais il pourrait être différent pour vous.

+0

Génial, merci, fonctionne parfaitement! Doit être smth comme ceci onView (withId (R.id.rvSettings)). Check (correspond (isDisplayed())). Perform (RecyclerViewActions.scrollTo (hasDescendant (avecText (stringId)))); –