![](/img/trans.png)
[英]How Android Espresso click an item in Recycler View inside Recycler View?
[英]Clicking inside a Recycler view: Espresso
我试图单击“回收者”视图内的菜单项,我有以下代码。
onView(allOf(withId(R.id.section_list),isDisplayed())).perform(RecyclerViewActions.actionOnItem(hasDescendant(withText("ABC")), MyViewAction.clickChildViewWithId(R.id.payment_menu)));
MyViewAction看起来像这样:
class MyViewAction {
public static ViewAction clickChildViewWithId(final int id) {
return new ViewAction() {
@Override
public Matcher<View> getConstraints() {
return null;
}
@Override
public String getDescription() {
return "Click on a child view with specified id.";
}
@Override
public void perform(UiController uiController, View view) {
View v = view.findViewById(id);
v.performClick();
}
};
}
android.support.test.espresso.PerformException:在ID为com.em3Agri.operation.debug:id / section_list的视图上执行“ android.support.test.espresso.contrib.RecyclerViewActions$ActionOnItemAtPositionViewAction@2fd64b56”时出错。 在android.support.test.espresso.PerformException $ Builder.build(PerformException.java:83)在.........原因:java.lang.IllegalStateException:位置38处没有视图持有者。 support.test.espresso.contrib.RecyclerViewActions $ ActionOnItemAtPositionViewAction.perform(RecyclerViewActions.java:290)在android.support.test.espresso.ViewInteraction $ 1.run(ViewInteraction.java:144)
我不知道这是否是您所面临错误的根本原因,但您应严格遵守matcher
和action
之间的区别,即
RecyclerViewActions.actionOnItem(
hasDescendant(withText("ABC")),
MyViewAction.clickChildViewWithId(R.id.payment_menu)
)
应该写成
RecyclerViewActions.actionOnItem(
<something-that-selects-R.id.payment_menu-in-your-view-item>,
click()
)
something-that-selects-R.id.payment_menu-in-your-view-item
实际上取决于您的视图设置,可能很难正确定义,因此也许其他方法之一(例如actionOnHolderItem
)可能是更合身。 这也应该运行得更快,因为它可以直接跳转到特定查看者所标识的视图,而Matcher<View>
版本只能逐项“滚动”您的RecyclerView
并检查每个新绑定的版本。
怎么样:
onView(withId(R.id.section_list))
.perform(
RecyclerViewActions.actionOnItem(
hasDescendant(withId(R.id.payment_menu)),
ViewActions.click()
)
);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.