浓缩咖啡: RecyclerView 滚动到底部

13

在Espresso中有没有一种方法可以滚动到recyclerview的末尾?

有一个带有文本“Text XYZ”的项目,recyclerview具有ID recycler_view。该项目恰好是recycler view的最后一个项目。

我尝试过

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

但是这似乎不起作用,有任何想法吗?


似乎无法工作 - 错误日志请。 - piotrek1543
在滚动到视图之前,您正在检查该视图是否已显示。 - denys
@denys 这个检查是针对实际的RecyclerView的。除非RecyclerView实际上没有显示,否则它不应该有任何影响。 - Be_Negative
是的,有意义。 - denys
3个回答

18

RecyclerViewActions.scrollTo() 操作匹配 ViewHolder 中的 ItemView,该 ViewHolder 是在适配器的 onCreateViewHolder() 中填充的。为了使 scrollTo() 正常工作,你需要提供一个能够唯一标识该 ItemView 的匹配器。

你当前的匹配器告诉 Espresso 要滚动到一个使用 TextView 作为 itemView 填充的 ViewHolder 上。虽然这种情况确实可能发生,但通常你会在那里添加一些 ViewGroup 样式的操作,以便按照自己的意愿来设计视图持有者的外观。

如果你将 scrollTo() 匹配器更改为 hasDescendant(withText("Text XYZ")),则可以考虑所有嵌套的布局(如果有多个)。

还要记住,因为你也试图点击该项-你不能在同一个 perform() 中执行它,因为它会将单击发送到当前的 ViewInteraction,在这种情况下是具有id R.id.recycler_viewRecyclerView。在同一个 perform() 中这样做只会在 RecyclerView 的中间部分单击,而不是你滚动到的项。

要解决此问题,你需要使用另一个使用了你用于滚动到项的匹配器的 onView() 语句,或使用 RecyclerView.actionOnItem()

如果使用另一个 onView() 语句,则 hasDescendant(withText("Text XYZ")) 将无法正常工作,因为它将找到该 TextView 的所有父级(viewholder、recyclerview、包含 recyclerview 的 viewgroup 等),因为它们都有这个特定的子代。这将强制你使 ItemView 匹配器更加精确,并考虑所有嵌套布局。在这种情况下,我通常会使用 withChild() 作为匹配器,但对于您可能会不同。


1
太棒了,谢谢,完美运行!应该像这样:onView(withId(R.id.rvSettings)).check(matches(isDisplayed())).perform(RecyclerViewActions.scrollTo(hasDescendant(withText(stringId)))); - Anton Kizema
onView(withId(R.id.recycler_view)) .perform(RecyclerViewActions .scrollTo(hasDescendant(withText(getString(stringResId))))); onView(withText(getString(stringResId))).perform(click()); - Sinigami

2

如果你知道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()));

0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接