Java 浓缩咖啡在Recyclerview项目中执行点击查看

Java 浓缩咖啡在Recyclerview项目中执行点击查看,java,android,android-recyclerview,android-espresso,Java,Android,Android Recyclerview,Android Espresso,我尝试了一切在recyclerview项目中执行单击查看,但没有成功。阅读互联网上的每一个选项并尝试,但仍然不起作用。最近我使用: onView(ViewMatchers.withId(R.id.live_rw_liveMatchList)) .perform(RecyclerViewActions.actionOnItemAtPosition(2, MyViewAction.clickChildViewWithId(R.id.pick_pw_pickLeft))); 但我得到的只是:

我尝试了一切在recyclerview项目中执行单击查看,但没有成功。阅读互联网上的每一个选项并尝试,但仍然不起作用。最近我使用:

onView(ViewMatchers.withId(R.id.live_rw_liveMatchList))
    .perform(RecyclerViewActions.actionOnItemAtPosition(2, MyViewAction.clickChildViewWithId(R.id.pick_pw_pickLeft)));
但我得到的只是:

android.support.test.espresso.AmbiguousViewMatcherException:'id为: android:id/ticket\u list\u list'匹配数据库中的多个视图 等级制度问题视图在下面用“****匹配****”标记

它只匹配一个视图(我的recyclerview有13个孩子)

我知道这应该行得通,但它在我的项目中不起作用。尝试仅在其他recyclerview中单击recyclerview项以使其更简单,如下所示:

onView(withId(R.id.ticket_list_list))
    .perform(RecyclerViewActions.actionOnItemAtPosition(0, click()));
但它给了我同样的信息->多重匹配问题


有人帮忙,我真的尝试了所有的方法,几天前我也遇到了同样的问题,但最终从StackOverflow那里得到了解决方案

如果要单击“回收器自定义项视图”,请单击,然后在项目中实现以下代码

您需要用java编写此代码,这将大大帮助您并节省您的时间

ClickOnButtonView控件是列表项中发生的查看操作,并且 UiController类帮助您查找自定义行项目

代码是用Kotlin编写的

@RunWith(AndroidJUnit4::class)
class CampaignFragmentTest {

    @get: Rule
    val activityTestRule = ActivityTestRule(TestActivity::class.java)

    @Test
    fun testCustomListClick() {
        clickOnButtonAtRow(0)
    }
}

private fun clickOnButtonAtRow(position: Int) {
    Espresso.onView(ViewMatchers.withId(R.id.list)).perform(RecyclerViewActions.actionOnItemAtPosition<RecyclerView.ViewHolder>
    (position, ClickOnButtonView()))
}

inner class ClickOnButtonView : ViewAction {
    internal var click = ViewActions.click()

    override fun getConstraints(): Matcher<View> {
        return click.constraints
    }

    override fun getDescription(): String {
        return " click on custom button view"
    }

    override fun perform(uiController: UiController, view: View) {
        //btnClickMe -> Custom row item view button
        click.perform(uiController, view.findViewById(R.id.btnClickMe))
    }
}
@RunWith(AndroidJUnit4::class)
类碎片测试{
@获取:规则
val activityTestRule=activityTestRule(TestActivity::class.java)
@试验
有趣的testCustomListClick(){
单击按钮箭头(0)
}
}
私人娱乐点击按钮箭头(位置:Int){
Espresso.onView(ViewMatchers.withId(R.id.list)).perform(RecycleServiceActions.ActionOnItemPosition
(位置,单击按钮视图())
}
内部类ClickOnButtonView:ViewAction{
内部变量click=ViewActions.click()
重写约束():匹配器{
返回click.constraints
}
重写getDescription():字符串{
返回“单击自定义按钮视图”
}
覆盖有趣的执行(uiController:uiController,视图:视图){
//btnClickMe->自定义行项目视图按钮
单击。执行(uiController,view.findviewbyd(R.id.btnClickMe))
}
}

前几天我也遇到了同样的问题,但最终从StackOverflow那里得到了解决方案

如果要单击“回收器自定义项视图”,请单击,然后在项目中实现以下代码

您需要用java编写此代码,这将大大帮助您并节省您的时间

ClickOnButtonView控件是列表项中发生的查看操作,并且 UiController类帮助您查找自定义行项目

代码是用Kotlin编写的

@RunWith(AndroidJUnit4::class)
class CampaignFragmentTest {

    @get: Rule
    val activityTestRule = ActivityTestRule(TestActivity::class.java)

    @Test
    fun testCustomListClick() {
        clickOnButtonAtRow(0)
    }
}

private fun clickOnButtonAtRow(position: Int) {
    Espresso.onView(ViewMatchers.withId(R.id.list)).perform(RecyclerViewActions.actionOnItemAtPosition<RecyclerView.ViewHolder>
    (position, ClickOnButtonView()))
}

inner class ClickOnButtonView : ViewAction {
    internal var click = ViewActions.click()

    override fun getConstraints(): Matcher<View> {
        return click.constraints
    }

    override fun getDescription(): String {
        return " click on custom button view"
    }

    override fun perform(uiController: UiController, view: View) {
        //btnClickMe -> Custom row item view button
        click.perform(uiController, view.findViewById(R.id.btnClickMe))
    }
}
@RunWith(AndroidJUnit4::class)
类碎片测试{
@获取:规则
val activityTestRule=activityTestRule(TestActivity::class.java)
@试验
有趣的testCustomListClick(){
单击按钮箭头(0)
}
}
私人娱乐点击按钮箭头(位置:Int){
Espresso.onView(ViewMatchers.withId(R.id.list)).perform(RecycleServiceActions.ActionOnItemPosition
(位置,单击按钮视图())
}
内部类ClickOnButtonView:ViewAction{
内部变量click=ViewActions.click()
重写约束():匹配器{
返回click.constraints
}
重写getDescription():字符串{
返回“单击自定义按钮视图”
}
覆盖有趣的执行(uiController:uiController,视图:视图){
//btnClickMe->自定义行项目视图按钮
单击。执行(uiController,view.findviewbyd(R.id.btnClickMe))
}
}

该错误意味着它找到了多个id为
R.id.ticket\u list\u list的视图。在您提供的错误消息之后还应该有一个视图层次结构日志,显示Espresso找到的视图与标有
****的相同id匹配****

因此,您可以更改要测试的视图的id,也可以通过提供另一个id来定位视图,如下所示:

onView(allOf(withId(recyclerViewID), viewMatcher))
    .perform(RecyclerViewActions.actionOnItemAtPosition(0, click()));

该错误意味着它找到了多个id为
R.id.ticket\u list\u list
的视图。在您提供的错误消息之后还应该有一个视图层次结构日志,显示Espresso找到的视图与标有
****的相同id匹配****

因此,您可以更改要测试的视图的id,也可以通过提供另一个id来定位视图,如下所示:

onView(allOf(withId(recyclerViewID), viewMatcher))
    .perform(RecyclerViewActions.actionOnItemAtPosition(0, click()));
您得到的错误意味着某处还有另一个视图也使用id票证列表

票证列表是您实际的列表视图吗?(您要单击的内容的父项)

如果是,那么它是屏幕上唯一可用的吗?
如果是,则使用以下命令

onView(allOf(withId(R.id.ticket_list_list), isDisplayed()))
    .perform(RecyclerViewActions.actionOnItemAtPosition(0, click()));
onView(allOf(withId(R.id.ticket_list_list), withParentIndex(index_of_matcher_here)))
    .perform(RecyclerViewActions.actionOnItemAtPosition(0, click()));
添加isDisplayed()匹配器使目标视图更加具体,方法是只针对显示的视图,而忽略现有但未显示的视图

如果确实显示了另一个匹配器(或者上述匹配器不适用于您)与您尝试匹配的匹配器具有相同的id,则使用以下匹配器

onView(allOf(withId(R.id.ticket_list_list), isDisplayed()))
    .perform(RecyclerViewActions.actionOnItemAtPosition(0, click()));
onView(allOf(withId(R.id.ticket_list_list), withParentIndex(index_of_matcher_here)))
    .perform(RecyclerViewActions.actionOnItemAtPosition(0, click()));
应该更明确地定位并为您提供包含您要查找的id及其索引的视图,而不是带有ParentIndex(某些\u编号)的isDisplayed()

在非常混乱的情况下,上面的方法仍然不起作用,可能是因为所有返回的视图都有相同的索引,可能是因为它们是另一个视图的子视图,那么您可以进行创造性的操作,比如

onView(allOf(withId(R.id.ticket_list_list), withParent(allOf(withId(if_of_the_parent), withParentIndex(index_of_matcher_here)))))
    .perform(RecyclerViewActions.actionOnItemAtPosition(0, click()));
改为指定父级的索引

只要把你的方式混合在一起就行了,只要确保不要对匹配者发疯,保持可读性就行了

尽可能少地使用(确保其可读性和可维护性,而不仅仅是由索引组成),您不会试图获取导弹目标的坐标-您只需要视图

您得到的错误意味着某处还有另一个视图也使用id