所有列表中的Espresso检查

bus*_*lee 7 android android-espresso

是否有能力espresso检查所有视图listview,而不是从中获取一个视图,但是检查所有视图.

它似乎onData()用于返回与列表中只有一个列表项的交互.这不是我的问题.

编辑: 其实我找到了一个解决方案,解决了我的问题,但它看起来像是尖峰而不是好的.我启动StealCount动作从ListViewcuz 获取项目数量我们不能从测试中做到这一点(因为我们在Inst线程内部).然后我开始使用列表视图检查任何项目的数据DataInteraction.看起来像这样:

public static void assertAllItems(
    final Matcher<View> adapterViewMatcher, 
    final Matcher<View> itemsMatcher
) {
    StealCountAction stealCountAction = new StealCountAction();
    onView(adapterViewMatcher).perform(stealCountAction);

    DataInteraction dataInteraction = onData(anything())
        .inAdapterView(adapterViewMatcher);

    for (int i = 0 ; i < stealCountAction.count; i++) {
        dataInteraction.atPosition(i)
            .onChildView(itemsMatcher)
            .check(ViewAssertions.matches(isDisplayed()));
    }
}

static class StealCountAction implements ViewAction {

    public int count;

    @Override
    public Matcher<View> getConstraints() {
        return instanceOf(AdapterView.class);
    }

    @Override
    public String getDescription() {
        return "Steal count action";
    }

    @Override
    public void perform(UiController uiController, View view) {
        count = ((AdapterView) view).getCount();
    }
}
Run Code Online (Sandbox Code Playgroud)

但无论如何它对我来说似乎很难看.还有其他能力吗?

jep*_*bio 1

我会用不同的方式来做。

要检查列表视图,您只需执行以下操作:

for (int i = 0; i < numItems; i++) {
    onData(anything())
            .inAdapterView(withId(R.id.listViewId)).atPosition(i)
            .check(matches(isDisplayed()));
}
Run Code Online (Sandbox Code Playgroud)

而且,以前,要获取 numItems 变量,您只需通过 ActivityTestRule 访问列表适配器即可:

 int numItems = ((ListView) mActivityRule.getActivity().findViewById(R.id.listViewId)).getAdapter().getCount();
Run Code Online (Sandbox Code Playgroud)

或者,如果它位于片段内:

int numItems = ((ListView) mActivityRule.getActivity().getSupportFragmentManager().findFragmentById(R.id.fragmentId).getView().findViewById(R.id.listViewId)).getAdapter().getCount();
Run Code Online (Sandbox Code Playgroud)

尽管我理解你的代码,但我认为这个更容易理解。唯一令人困惑的部分是访问适配器的方式。但如果您愿意,您可以创建其他中间变量以使其更具可读性,或者创建一个函数来获取此数字。