Android 在Espresso中,指定要使用当前可见的AdapterView

Android 在Espresso中,指定要使用当前可见的AdapterView,android,android-espresso,Android,Android Espresso,在一个活动中,我有一个带有两个选项卡的ViewPager,“全部”和“过滤”。 两个页面使用相同的片段来显示数据,不同之处在于“过滤”页面根据某些条件过滤数据 我想单击“全部”页面中的项目(可能也存在于“筛选”页面中),如果我这样做: onData(transactionWithId(960L)).perform(click()); 作为回应,我得到: 含糊不清的ViewMatcherException:'可从类分配:类 “android.widget.AdapterView”匹配层次结构中的

在一个活动中,我有一个带有两个选项卡的
ViewPager
,“全部”和“过滤”。
两个页面使用相同的
片段
来显示数据,不同之处在于“过滤”页面根据某些条件过滤数据

我想单击“全部”页面中的项目(可能也存在于“筛选”页面中),如果我这样做:

onData(transactionWithId(960L)).perform(click());
作为回应,我得到:

含糊不清的ViewMatcherException:'可从类分配:类 “android.widget.AdapterView”匹配层次结构中的多个视图

然后,我试图通过指定一个附加约束来细化我的描述,即我正在寻找一个可见的项目:

onData(allOf(transactionWithId(960L), isDisplayed())).perform(click());
我也犯了同样的错误

然后我想以某种方式指定,我正在“所有”选项卡中查找我的项目(但不确定这是否正确):

但同样的错误

然后我尝试指定我正在寻找当前在我面前的
AdapterView

onData(allOf(
       is(instanceOf(Transaction.class)), 
       transactionWithId(960L))
   ).inAdapterView(allOf(
            isAssignableFrom(AdapterView.class),
            isDisplayed())
          ).perform(click());
我得到:

PerformException:在视图(is)上执行“加载适配器数据”时出错 可从类分配:类android.widget.AdapterView和is 在屏幕上向用户显示

请注意,我可以用一个
列表视图
单击在
活动
中显示的项目,我面临的挑战是当我有一个带有多个选项卡的
查看页面
使用一个
片段
来显示数据时。

非常感谢您的帮助。

您的方法应该有效。,我创建了一个简单的工作示例

问题的要点是区分这两个适配器视图。另一种方法是明确地标记它们。然后,我们可以使用特定标记上的自定义
Matcher
限制
datainteraction
,使用
inAdapterView()
。完整的代码仍然是,我引用关键点:

在适配器视图中:

boolean isFiltered = ...
AdapterView av = ...
av.setTag(isFiltered);
在测试中:

@Test
public void testClickOnSecondItemInAllTab() {
    onData(instanceOf(String.class)).inAdapterView(withTag(false)) //
                                    .atPosition(1)                 //
                                    .perform(click());
}
以及标记上的自定义视图匹配器:

static Matcher<View> withTag(final Object tag) {
    return new TypeSafeMatcher<View>() {

        @Override
        public void describeTo(final Description description) {
            description.appendText("has tag equals to: " + tag);
        }

        @Override
        protected boolean matchesSafely(final View view) {
            Object viewTag = view.getTag();
            if (viewTag == null) {
                return tag == null;
            }

            return viewTag.equals(tag);
        }
    };
}
带标记的静态匹配器(最终对象标记){
返回新的TypeSafeMatcher(){
@凌驾
公共无效说明(最终说明){
description.appendText(“has tag等于:”+tag);
}
@凌驾
受保护的布尔匹配安全(最终视图){
Object viewTag=view.getTag();
if(viewTag==null){
返回标记==null;
}
返回viewTag.equals(标记);
}
};
}
static Matcher<View> withTag(final Object tag) {
    return new TypeSafeMatcher<View>() {

        @Override
        public void describeTo(final Description description) {
            description.appendText("has tag equals to: " + tag);
        }

        @Override
        protected boolean matchesSafely(final View view) {
            Object viewTag = view.getTag();
            if (viewTag == null) {
                return tag == null;
            }

            return viewTag.equals(tag);
        }
    };
}