Эспрессо. Ошибка при выполнении "данных адаптера нагрузки"

У меня есть ListView, который показывает данные из базы данных.

    db = new DB(this);
    db.open();


    String[] from = new String[]{DB.COLUMN_FIRSTNAME, DB.COLUMN_LASTNAME};
    int[] to = new int[]{android.R.id.text1, android.R.id.text2};        

    scAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_activated_2, null, from, to, 0);
    lvData = (ListView) findViewById(R.id.lvData);
    lvData.setAdapter(scAdapter);

    lvData.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
    lvData.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() {

Он отображает имя и фамилию из базы данных в виде списка элементов: Нажмите, чтобы пользовательский интерфейс

Итак, сегодня я попытался использовать Espresso с этим приложением, и я не могу найти способ щелкнуть элемент, содержащий текст.

Когда я использую:

onData(anything())
    .inAdapterView(withId(R.id.lvData))
    .atPosition(3)
    .perform(click());

Он работает отлично. Но я хочу щелкнуть элемент, содержащий соответствующий текст элемента.

То, что я пробовал до сих пор (все, что я нашел в stackoverflow, google, github и т.д.):

onView(allOf(withText("Ivan Ivanov"))).perform(click())

onData(allOf(is(instanceOf(MainActivity.class)),is("Ivan Ivanov")))
            .inAdapterView(withId(R.id.lvData))
            .perform(click());

onData(hasToString(startsWith("v")))
            .inAdapterView(withId(R.id.lvData))
            .atPosition(0).perform(click());

onData(instanceOf(MainActivity.class))
            .inAdapterView(withId(R.id.lvData))
            .atPosition(0)
            .check(matches(hasDescendant(withText("Ivan Ivanov"))));

onData(anything()).inAdapterView(withContentDescription("Ivan Ivanov"))
            .atPosition(0).perform(click());

Итак, возможно, есть различия между строкой "Иван Иванов" и элементом, который содержит данные из базы данных: firstName + lastName?

Ответ 1

Используйте CursorMatchers для сопоставления элементов в вашем списке.

onData() работает с данными вашего адаптера, а не с фактическим видом. В вашем случае ListView поддерживается CursorAdapter, поэтому CursorMatcher.

И используется следующее:

onData(withRowString(DB.COLUMN_FIRSTNAME, "Ivan")).perform(click());