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()
匹配 ViewHolder
的 ItemView
,后者在适配器的 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()));
有没有办法使用 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()
匹配 ViewHolder
的 ItemView
,后者在适配器的 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()));