У меня есть следующий список RecyclerView:
Я хочу, чтобы только в моем тесте был установлен флажок справа, а не весь элемент.Вот что я попробовал:
onView(withId(R.id.recycler_view))
.perform(actionOnViewHolder<ViewHolder>(matcher = { vh ->
if (vh == null) return@actionOnViewHolder false
if (vh.position == no) {
// v1
(vh.itemView as ViewGroup).findViewById<View>(R.id.checkbox)?.performClick()
// v2
(vh.itemView as ViewGroup).getChildAt(2)?.performClick()
}
return@actionOnViewHolder false
}))
И некоторые вспомогательные методы / классы:
inline fun <reified VH : RecyclerView.ViewHolder> actionOnViewHolder(
noinline matcher: (VH?) -> Boolean): RecyclerViewActions.PositionableRecyclerViewAction {
return RecyclerViewActions.actionOnHolderItem(
RecyclerViewViewHolderMatcher(VH::class.java, matcher), ViewActions.click())
}
class RecyclerViewViewHolderMatcher<VH : RecyclerView.ViewHolder>(
clazz: Class<VH>,
private val matcher: (VH?) -> Boolean) : BoundedMatcher<RecyclerView.ViewHolder, VH>(clazz) {
override fun describeTo(description: Description?) { }
override fun matchesSafely(item: VH): Boolean = matcher(item)
}
V1: (vh.itemView as ViewGroup).findViewById<View>(R.id.checkbox)
возвращает ноль, хотя в отладчике я вижу, что представление, которое3 ребенка, последний из которых имеет идентификатор: checkbox
.
V2: (vh.itemView as ViewGroup).getChildAt(2)
возвращает представление, но щелчок происходит намного позже.
Кроме того, я всегда возвращаю false
от actionOnViewHolder
, потому что я не хочу click()
или что-либо еще для всего ViewHolder.
Есть ли способ сделать это лучше?