Wie behaupte ich in einem RecyclerView in Espresso?

Ich benutze Espresso-Beitrag, um Aktionen auf einem RecyclerView durchzuführen, und es funktioniert so wie es sollte, zB:

 onView(withId(R.id.recycler_view)) .perform(RecyclerViewActions.actionOnItemAtPosition(0, click())); //click on first item 

Und ich muss darauf Aussagen machen. Etwas wie das:

  • Android Espresso Intents Test zufällig scheitern mit `` init () muss vor der Verwendung dieser Methode aufgerufen werden "
  • Double Espresso funktioniert nicht mit Robolectric
  • Error = Kann keine Instrumentierungsinformationen finden für: ComponentInfo {}
  • Kann ich eine benutzerdefinierte Anwendung in Espresso verlängern?
  • Android Espresso ListView klicken Sie auf Element
  • Espressotest fällt mit NoActivityResumedException oft aus
  •  onView(withId(R.id.recycler_view)) .perform(RecyclerViewActions.actionOnItemAtPosition(0, check(matches(withText("Test Text")))); 

    Aber da RecyclerViewActions natürlich eine Aktion erwartet, sagt es falsches 2. Argument-Typ. Es gibt keine RecyclerViewAssertions auf Espresso-Beitrag.

    Gibt es irgendeine Möglichkeit, Behauptungen auf einer Recycler-Ansicht durchzuführen?

  • Ich möchte Google Map API für Reverse Geocode in Android analysieren
  • Der Import android.support kann nicht aufgelöst werden
  • Finden Sie das Gerät Modell und machen
  • Schnellste Weg, um lange aus Datei zu lesen?
  • Android-Buildscript-Repositories: jcenter VS mavencentral
  • Stellen Sie die beschreibbare Größe programmgesteuert ein
  • 6 Solutions collect form web for “Wie behaupte ich in einem RecyclerView in Espresso?”

    Du solltest Danny Roas Lösung ausprobieren. Custom RecyclerView Actions Und benutze es so:

     onView(withRecyclerView(R.id.recycler_view) .atPositionOnView(1, R.id.ofElementYouWantToCheck)) .check(matches(withText("Test text"))); 

    Ziemlich einfach. Es ist keine zusätzliche Bibliothek nötig. Machen:

      onView(withId(R.id.recycler_view)) .check(matches(atPosition(0, withText("Test Text")))); 

    Mit der Methode, die Sie in Ihre Utils Klasse setzen können.

     public static Matcher<View> atPosition(final int position, @NonNull final Matcher<View> itemMatcher) { checkNotNull(itemMatcher); return new BoundedMatcher<View, RecyclerView>(RecyclerView.class) { @Override public void describeTo(Description description) { description.appendText("has item at position " + position + ": "); itemMatcher.describeTo(description); } @Override protected boolean matchesSafely(final RecyclerView view) { RecyclerView.ViewHolder viewHolder = view.findViewHolderForAdapterPosition(position); if (viewHolder == null) { // has no item on such position return false; } return itemMatcher.matches(viewHolder.itemView); } }; } 

    Wenn Ihr Artikel auf dem Bildschirm zuerst nicht sichtbar ist, dann scrollen Sie es vorher:

      onView(withId(R.id.recycler_view)) .perform(scrollToPosition(87)) .check(matches(atPosition(87, withText("Test Text")))); 

    Nur um die Antwort von riwnodennyk zu erweitern, wenn dein ViewHolder eine ViewGroup anstelle eines direkten View Objekts wie TextView , dann kannst du hasDescendant Matcher hinzufügen, um das TextView Objekt in der ViewGroup . Beispiel:

     onView(withId(R.id.recycler_view)) .check(matches(atPosition(0, hasDescendant(withText("First Element"))))); 

    Ich habe auf die gleiche Frage gekämpft, wo ich eine Recycler-Ansicht mit 6 Items habe und dann muss ich die an Position 5 wählen und die 5. ist nicht sichtbar auf der Ansicht.
    Die obige Lösung funktioniert auch. Auch ich weiß, dass es ein bisschen spät ist, aber es lohnt sich zu teilen.

    Ich tat dies mit einer einfachen Lösung wie unten:

     onView(withId(R.id.recylcer_view)) .perform(RecyclerViewActions.actionOnItem( hasDescendant(withText("Text of item you want to scroll to")), click())); 

    RecyclerViewActions.actionOnItem – Führt eine ViewAction in einer Ansicht durch, die mit viewHolderMatcher .

    1. itemViewMatcher RecyclerView zur Ansicht, die mit itemViewMatcher
    2. Führen Sie eine Aktion auf der übereinstimmenden Ansicht aus

    Weitere Details finden Sie unter: RecyclerViewActions.actionOnItem

    In meinem Fall war es notwendig, Danny Roas und riwnodennyks Lösung zu verschmelzen:

     onView(withId(R.id.recyclerview)) .perform(RecyclerViewActions.scrollToPosition(80)) .check(matches(atPositionOnView(80, withText("Test Test"), R.id.targetview))); 

    Und die Methode:

     public static Matcher<View> atPositionOnView(final int position, final Matcher<View> itemMatcher, @NonNull final int targetViewId) { return new BoundedMatcher<View, RecyclerView>(RecyclerView.class) { @Override public void describeTo(Description description) { description.appendText("has view id " + itemMatcher + " at position " + position); } @Override public boolean matchesSafely(final RecyclerView recyclerView) { RecyclerView.ViewHolder viewHolder = recyclerView.findViewHolderForAdapterPosition(position); View targetView = viewHolder.itemView.findViewById(targetViewId); return itemMatcher.matches(targetView); } }; } 

    Danny Roas Lösung ist genial, aber es hat nicht funktioniert für die Off-Screen-Elemente, die ich gerade gescrollt hatte. Das Update ersetzt das:

     View targetView = recyclerView.getChildAt(this.position) .findViewById(this.viewId); 

    mit diesem:

     View targetView = recyclerView.findViewHolderForAdapterPosition(this.position) .itemView.findViewById(this.viewId); 

    … in der TestUtils Klasse .

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.