如何获取某个列表元素的详细信息?

时间:2017-04-10 11:18:17

标签: android for-loop exception android-espresso

我有一个列表视图,包含多个具有相同Id的行;每行有几个不同的组件。这是层次结构的摘录(所有都具有visibility = VISIBLE):

->ListView{id=213, res-name=listview, child-count=2}
-->RelativeLayout{id=214, res-name=bground, child-count=5}
--->AppCompatTextView{id=215, res-name=name, text=Short}
--->AppCompatTextView{id=216, res-name=valid, text=10.04.}
--->... further elements in the RelativeLayout res-name=bground
-->RelativeLayout{id=214, res-name=bground, child-count=5}
--->AppCompatTextView{id=215, res-name=name, text=Group}
--->AppCompatTextView{id=216, res-name=valid, text=09.04}
--->...

我想循环遍历此列表中的所有第一级元素(所有RelativeLayout元素都使用res-name = bground)并检查name属性;一旦我找到了我搜索的元素(例如name = Group),我想检查其他属性。

我目前的编码是:

for (int i = 0; i < numItems; i++) {
    String type = getDataText(allOf(withId(R.id.name),
        childAtPosition(
            allOf(withId(R.id.bground),
                childAtPosition(withId(R.id.listview),i)),
            0),
        isDisplayed()));

其中getDataText是:

String getDataText(final Matcher<View> matcher) {
    final String[] stringHolder = { null };
    onData(matcher).perform(new ViewAction() {
        @Override
        public Matcher<View> getConstraints() {
            return isAssignableFrom(TextView.class);
        }

        @Override
        public String getDescription() {
            return "getting text from a TextView";
        }

        @Override
        public void perform(UiController uiController, View view) {
            TextView tv = (TextView)view; 
            stringHolder[0] = tv.getText().toString();
        }
    });
    return stringHolder[0];
}

在执行上面显示的循环时,我得到一个AmbiguousViewMatcherException,其中listview被标记为问题。我想这意味着Espresso在listview元素中找到了含糊不清的子元素(这是真的),但是childAtPosition应该只采用位置索引指定的元素。

如何正确实现循环?

谢谢和最诚挚的问候 格哈德

1 个答案:

答案 0 :(得分:0)

您可以将isDisplayed()添加到您的adapterview匹配器,以与当前可见的列表视图进行交互。

inAdapterView(allOf(withId(android.R.id.list),isDisplayed()))