AdapterView — это особый вид представления, специально разработанный для отображения набора аналогичной информации, такой как список продуктов и пользовательские контакты, полученные из основного источника данных с использованием Adapter . Источником данных может быть простой список сложных записей в базе данных. Некоторые из представлений, полученных из AdapterView, это ListView , GridView и Spinner .
AdapterView визуализирует пользовательский интерфейс динамически в зависимости от объема данных, доступных в базовом источнике данных. Кроме того, AdapterView отображает только минимально необходимые данные, которые можно отобразить в доступной видимой области экрана. AdapterView делает это для экономии памяти и для того, чтобы пользовательский интерфейс выглядел гладким, даже если базовые данные велики.
После анализа природа архитектуры AdapterView делает опцию onView и сопоставления его представлений неактуальной, поскольку конкретный проверяемый вид может вообще не отображаться вообще. К счастью, espresso предоставляет метод onData ( ), который принимает сопоставления hamcrest (относящиеся к типу данных базовых данных) для сопоставления базовых данных и возвращает объект типа DataInteraction, соответствующий представлению сопоставленных данных. Пример кода выглядит следующим образом:
onData(allOf(is(instanceOf(String.class)), startsWith("Apple"))).perform(click())
Здесь onData () сопоставляет запись «Apple», если она доступна в базовых данных (список массивов), и возвращает объект DataInteraction для взаимодействия с согласованным представлением (TextView, соответствующее записи «Apple»).
методы
DataInteraction предоставляет следующие методы для взаимодействия с представлением,
выполнить ()
Это принимает действия просмотра и запускает переданные действия просмотра.
onData(allOf(is(instanceOf(String.class)), startsWith("Apple"))).perform(click())
проверять()
Это принимает утверждения представления и проверяет переданные утверждения представления.
onData(allOf(is(instanceOf(String.class)), startsWith("Apple"))) .check(matches(withText("Apple")))
inAdapterView ()
Это принимает представления соответствия. Он выбирает конкретный AdapterView на основе переданных сопоставлений представления и возвращает объект DataInteraction для взаимодействия с сопоставленным AdapterView.
onData(allOf()) .inAdapterView(withId(R.id.adapter_view)) .atPosition(5) .perform(click())
atPosition ()
Это принимает аргумент типа integer и ссылается на позицию элемента в базовых данных. Он выбирает представление, соответствующее переданному позиционному значению данных, и возвращает объект DataInteraction для взаимодействия с сопоставленным представлением. Это будет полезно, если мы знаем правильный порядок основных данных.
onData(allOf()) .inAdapterView(withId(R.id.adapter_view)) .atPosition(5) .perform(click())
onChildView ()
Это принимает сопоставления представлений и сопоставляет представление внутри определенного дочернего представления. Например, мы можем взаимодействовать с определенными элементами, такими как кнопка « Купить» в списке продуктов на основе AdapterView .
onData(allOf(is(instanceOf(String.class)), startsWith("Apple"))) .onChildView(withId(R.id.buy_button)) .perform(click())
Написать образец заявки
Выполните шаги, показанные ниже, чтобы написать простое приложение на основе AdapterView и написать контрольный пример с помощью метода onData () .
-
Запустите Android-студию.
-
Создайте новый проект, как обсуждалось ранее, и назовите его MyFruitApp .
-
Перенесите приложение на платформу AndroidX, используя меню параметров Refactor → Migrate to AndroidX .
-
Удалите дизайн по умолчанию в основной деятельности и добавьте ListView . Содержимое Activity_main.xml выглядит следующим образом:
Запустите Android-студию.
Создайте новый проект, как обсуждалось ранее, и назовите его MyFruitApp .
Перенесите приложение на платформу AndroidX, используя меню параметров Refactor → Migrate to AndroidX .
Удалите дизайн по умолчанию в основной деятельности и добавьте ListView . Содержимое Activity_main.xml выглядит следующим образом:
<?xml version = "1.0" encoding = "utf-8"?> <RelativeLayout xmlns:android = "http://schemas.android.com/apk/res/android" xmlns:app = "http://schemas.android.com/apk/res-auto" xmlns:tools = "http://schemas.android.com/tools" android:layout_width = "match_parent" android:layout_height = "match_parent" tools:context = ".MainActivity"> <ListView android:id = "@+id/listView" android:layout_width = "wrap_content" android:layout_height = "wrap_content" /> </RelativeLayout>
-
Добавьте новый ресурс макета item.xml, чтобы указать шаблон элемента представления списка. Содержимое item.xml выглядит следующим образом:
Добавьте новый ресурс макета item.xml, чтобы указать шаблон элемента представления списка. Содержимое item.xml выглядит следующим образом:
<?xml version = "1.0" encoding = "utf-8"?> <TextView xmlns:android = "http://schemas.android.com/apk/res/android" android:id = "@+id/name" android:layout_width = "fill_parent" android:layout_height = "fill_parent" android:padding = "8dp" />
-
Теперь создайте адаптер с массивом фруктов в качестве базовых данных и установите его в виде списка. Это должно быть сделано в onCreate () MainActivity, как указано ниже,
Теперь создайте адаптер с массивом фруктов в качестве базовых данных и установите его в виде списка. Это должно быть сделано в onCreate () MainActivity, как указано ниже,
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Find fruit list view final ListView listView = (ListView) findViewById(R.id.listView); // Initialize fruit data String[] fruits = new String[]{ "Apple", "Banana", "Cherry", "Dates", "Elderberry", "Fig", "Grapes", "Grapefruit", "Guava", "Jack fruit", "Lemon", "Mango", "Orange", "Papaya", "Pears", "Peaches", "Pineapple", "Plums", "Raspberry", "Strawberry", "Watermelon" }; // Create array list of fruits final ArrayList<String> fruitList = new ArrayList<String>(); for (int i = 0; i < fruits.length; ++i) { fruitList.add(fruits[i]); } // Create Array adapter final ArrayAdapter adapter = new ArrayAdapter(this, R.layout.item, fruitList); // Set adapter in list view listView.setAdapter(adapter); }
-
Теперь скомпилируйте код и запустите приложение. Снимок экрана приложения My Fruit выглядит следующим образом:
Теперь скомпилируйте код и запустите приложение. Снимок экрана приложения My Fruit выглядит следующим образом:
-
Теперь откройте файл ExampleInstrumentedTest.java и добавьте ActivityTestRule, как указано ниже,
Теперь откройте файл ExampleInstrumentedTest.java и добавьте ActivityTestRule, как указано ниже,
@Rule public ActivityTestRule<MainActivity> mActivityRule = new ActivityTestRule<MainActivity>(MainActivity.class);
Также убедитесь, что тестовая конфигурация выполнена в app / build.gradle —
Добавьте новый контрольный пример для проверки представления списка, как показано ниже,
Наконец, запустите тестовый набор, используя контекстное меню Android Studio, и проверьте, все ли тестовые примеры выполнены успешно.