Espresso scrollTo(Matcher)针对RecyclerView数据绑定项不生效问题咨询
问题根源
- DataBinding 调用
setVariable()设置变量后,默认不会立刻将值同步到对应的View控件上,而是会发送更新任务到主线程消息队列,等待下一帧绘制时再完成赋值。 RecyclerViewActions.scrollTo()内部的匹配逻辑会在onBindViewHolder()执行结束后立刻触发,此时绑定的更新任务还未执行,TextView的text属性仍为空,因此Matcher匹配失败。- 直接使用Espresso断言可以成功,是因为Espresso默认会等待主线程所有空闲任务执行完成后再执行断言,此时绑定更新已经完成,因此可以读到正确的text值。
- 你之前将
executePendingBindings()放在onCreateViewHolder()中是无效的,此时还未调用setVariable()设置数据,没有待执行的绑定更新任务。
修复方案
只需要将executePendingBindings()的调用移动到setVariable()之后,强制立刻执行待处理的绑定操作,将值同步到View上即可。这也是官方推荐的RecyclerView搭配DataBinding使用的最佳实践,可以避免绑定延迟导致的各类显示、测试问题。
修改后的ViewHolder代码如下:
inner class CustomViewHolder(private val binding: ViewDataBinding) : RecyclerView.ViewHolder(binding.root) { fun bind(item: String) { binding.setVariable(BR.text, item) // 强制立刻执行绑定更新,将值写入对应View binding.executePendingBindings() } }
修改后scrollTo()的Matcher进行检查时,就能读到View上正确的属性值,匹配逻辑即可正常运行。
内容的提问来源于stack exchange,提问作者Slartibartfast
相关产品推荐
相关产品推荐

