当前位置: 首页 > 知识库问答 >
问题:

在回收器视图中单击两个项目

后星河
2023-03-14
onView(withId(R.id.recycler_view))
    .perform(
        RecyclerViewActions.actionOnItemAtPosition<CustomAdapter.CustomViewHolder>(
            1, 
            longClick()
        )
    )
onView(withId(R.id.recycler_view))
    .perform(
        RecyclerViewActions.actionOnItemAtPosition<CustomAdapter.CustomViewHolder>(
            2,
            longClick()
        )
    )
onView(withId(R.id.recycler_view))
    .perform(
        RecyclerViewActions.actionOnItemAtPosition<CustomAdapter.CustomViewHolder>(
            1,
            longClick()
        ),        
        RecyclerViewActions.actionOnItemAtPosition<CustomAdapter.CustomViewHolder>(
            2,
            longClick()
        )
    )
@get:Rule
var activityTestRule = ActivityTestRule(
        ListActivity::class.java,
        true,
        false
)

然后,在每个@test方法中,我调用activitytestrule.launchactivity(Intent.action_main)),然后进行单击。我发现,只有第一次点击不起作用,但第二次和第三次点击起作用。那么,这种行为的原因又能是什么呢?

共有1个答案

罗昊空
2023-03-14

我找到了问题的原因。我在我的循环视图项中的布局内有一个视图。这个视图实现WebView,它加载一些标记文本。加载需要一些时间,所以我的点击是在视图真正呈现之前执行的。下面是使测试工作的代码示例:

onView(withId(R.id.recycler_view))
                .perform(
                        waitForMillis(1500),//wait until markdown views loaded
                        actionOnItemAtPosition<CustomAdapter.CustomViewHolder>(1, longClick()),
                        actionOnItemAtPosition<CustomAdapter.CustomViewHolder>(2, longClick())
                )

其中waitForMillis()是自定义动作

fun waitForMillis(millis: Long): ViewAction? {
    return object : ViewAction {
        override fun getConstraints(): Matcher<View> {
            return isDisplayed()
        }

        override fun getDescription(): String {
            return "Wait for $millis milliseconds."
        }

        override fun perform(uiController: UiController, view: View) {
            uiController.loopMainThreadForAtLeast(millis)
        }
    }
}

这种解决方案有缺点。为了确保视图会在点击之前呈现,你需要设置固定的时间,这可能会比呈现真正需要的时间更多。所以最好的解决方案是自定义匹配器,但我现在没有现成的例子。

 类似资料:
  • 如果用户点击一个,我希望它做一些事情,也为两个和三个。我如何实现这一点?

  • 请帮助如何使其工作

  • 单击时的卡片视图正在工作。但回收器视图的区域不可单击。如何使其可点击,以便捕获卡片视图的事件。

  • 我正面临一个奇怪的错误,其中recyclerview只显示了一个项目。下面是我的recyclerview适配器的代码: 我已经在其他应用程序中使用了这段代码,它的工作非常完美。我已经检查了聊天数据,这也是完美的。 这里是指向git repo布局文件的链接:布局文件

  • 我有音频播放器布局作为一个项目在回收器视图。我想播放图标改变为暂停图标在图标点击。日志显示图标已经设置,但图标在回收器视图中的外观没有改变。 我的代码: 我实际上有一个线性布局音频项目。我正在设置onClickListener()no一个ImageButton来将其背景从play更改为pause。 额外信息: 我观察到第一次点击图标并没有什么作用。 第二次点击它会将它改变为暂停图标,但它会迅速返回