Espresso:Recyclerview 滚动到结束

Espresso : Recyclerview scroll to end

有没有办法使用 Espresso 滚动到 recyclerview 的末尾?

有一个项目的文本假设为 'Text XYZ',recyclerview 的 ID 为 recycler_view。此项恰好是回收站视图的最后一项。

我试过了

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

但这似乎行不通。有什么想法吗?

RecyclerViewActions.scrollTo() 匹配 ViewHolderItemView,后者在适配器的 onCreateViewHolder() 中膨胀。为了使 scrollTo() 起作用,您需要提供一个唯一标识 ItemView.

的匹配器

您当前的匹配器告诉 espresso 滚动到一个 ViewHolder,该 ViewHolder 用 TextView 作为 itemView 膨胀。这可能会发生,但通常您会在那里进行一些 ViewGroup 操作,以按照您希望的方式设置视图持有者的样式。

如果您将 scrollTo() 匹配器更改为 hasDescendant(withText("Text XYZ")) 以说明所有嵌套布局(如果有多个嵌套布局)。

另外请记住,因为您也在尝试单击该项目 - 您不能在同一个 perform() 中执行此操作,因为它会将点击发送到当前的 ViewInteraction,即在这种情况下,一个 RecyclerView 和 id R.id.recycler_view。在相同的操作中这样做只是单击 RecyclerView 的中间,而不是您滚动到的项目。

要解决这个问题,您需要另一个 onView() 和您用来滚动到某个项目的匹配器,或者使用 RecyclerView.actionOnItem().

在另一个 onView() 语句的情况下,hasDescendant(withText("Text XYZ")) 会让你失败,因为它会找到该 TextView 的所有父级(viewholder、recyclerview、持有 recyclerview 的视图组等等)因为他们都有这个特殊的后代。这将迫使您使 ItemView 匹配器更加精确并考虑所有嵌套布局。在这些情况下,我通常去匹配器 withChild(),但对你来说可能会有所不同。

即使此方法不显示向上滚动,但允许您 select 回收站的位置。 感谢这个人(Espresso-testing-recyclerviews 我使用了这种方法:

onView(allOf(withId(R.id.recyclerUserCustomListsView))) .perform(RecyclerViewActions.actionOnItemAtPosition(7, click()));

如果您知道 RecyclerView 的最后位置,则可以滚动到它

static final int LAST_POSITION = 100;

// First method
onView(withId(R.id.recyclerview))
    .perform(RecyclerViewActions.scrollToPosition((LAST_POSITION)));

// Second method
onView(withId(R.id.recyclerview))
        .perform(actionOnItemAtPosition(LAST_POSITION, scrollTo()));