- Эта серия будет посвящена основам Android Room library. Я буду следовать официальному руководству Google, ЗДЕСЬ но я буду работать в том порядке, который имеет для меня больше смысла.
На пару слов
- Этот пост является продолжением части 2 моего последнего поста, описывающей, как мы настраиваем RecyclerView для использования с базой данных Room. Этот пост будет посвящен настройке адаптера и запуску нашего RecyclerView.
Адаптер
Адаптер и ViewHolder (из предыдущего поста) работают вместе, чтобы определить, как выглядят наши данные.
ViewHolder – это оболочка вокруг представления, содержащая макет для отдельных элементов в нашем динамическом списке.
Адаптер создает объекты ViewHolder по мере необходимости, а также задает данные для этих объектов. Процесс привязки объектов к их данным называется привязкой.
Когда мы создаем “обычный” адаптер, нам нужно переопределить 3 основных метода
1) onCreateViewHolder(): RecyclerView вызывает этот метод всякий раз, когда ему необходимо создать новый ViewHolder. Метод создает и инициализирует ViewHolder и связанное с ним представление, но он не заполняет содержимое представления. Таким образом, этот метод используется для создания объекта ViewHolder, но не привязывает к нему никаких данных.
2) onBindViewHolder(): RecyclerView вызывает этот метод, чтобы связать ViewHolder с данными. Метод извлекает соответствующие данные и использует их для заполнения макета viewholder. Этот метод используется для привязки данных к объекту ViewHolder.
3) getItemCount(): RecyclerView вызывает этот метод, чтобы получить размер набора данных.
- Итак, теперь давайте посмотрим на адаптер, который мы будем внедрять.
public class WordListAdapter extends ListAdapter{ public WordListAdapter(DiffUtil.ItemCallback diffCallback) { super(diffCallback); } @Override public WordViewHolder onCreateViewHolder( ViewGroup parent, int viewType) { return WordViewHolder.create(parent); } @Override public void onBindViewHolder( WordViewHolder holder, int position) { Word current = getItem(position); holder.bind(current.getWord()); } public static class WordDiff extends DiffUtil.ItemCallback { @Override public boolean areItemsTheSame(Word oldItem,Word newItem){ return oldItem == newItem; } @Override public boolean areContentsTheSame(Word oldItem,Word newItem){ return oldItem.getWord().equals(newItem.getWord()); } } }
Что такое ListAdapter?
- Итак, первое, что вы заметили, это то, что мы используем подкласс адаптера с именем
ListAdapter
. Этот специальный адаптер помогает обновлять списки. Он использует алгоритмEugene W. Myers
diffing для определения того, что и когда обновлять. Это очень эффективно.
Где находится getItemCount()?
Вы, наверное, заметили, что мы не реализовали getItemCount(). Мы можем это сделать, потому что мы используем ListAdapter, который выполняет реализацию этого метода для нас.
Если этот синтаксис сбивает вас с толку:
ListAdapter
затем нам нужно немного обновить общие сведения и более конкретно узнать, как использоватьпараметры ограниченного типа
.Если вы уже знакомы с обобщениями и параметрами ограниченного типа, то не стесняйтесь пропустить этот следующий раздел.
Дженерики
- Поэтому, когда мы говорим о дженериках, мы сначала должны спросить себя, какие преимущества дают нам дженерики? Что ж, у дженериков есть несколько преимуществ, но главное из них – более строгая проверка типов:
Проверка типов: generics обеспечивает нашему коду более строгую проверку типов во время компиляции. Это очень важно, потому что оно стирает множество ошибок во время выполнения, преобразуя их в ошибки времени компиляции. Ошибки во время компиляции гораздо легче выявить и исправить, чем ошибки во время выполнения.
Создание универсального класса
- Универсальный класс определяется со следующим синтаксисом:
class name{ //Typical member fields }
<>
называетсяалмазом
и это то, что используется для хранения типов. В дженериках столицаT
используется для представления параметра типа во время объявления класса.Теперь, если мы посмотрим на документацию ListAdapter, мы увидим, что он использует дженерики таким образом:
ListAdapter VH расширяет RecyclerView. VH расширяет RecyclerView. ViewHolder>
- Как мы уже упоминали ранее, мы знаем, что
T
используется для представления типа во время объявления, но что, черт возьми, такоеVH расширяет RecyclerView. Держатель представления
? Ну, чтобы понять это, мы должны сначала узнать опараметрах ограниченного типа
.
Параметры Ограниченного Типа
- Могут быть случаи, когда вы захотите ограничить те типы, которые могут использоваться в качестве параметров типа внутри универсального класса или метода. Это то, что
параметры ограниченного типа
позволяют нам делать. - Чтобы объявить параметр ограниченного типа, мы перечисляем имя параметра типа, за которым следует ключевое слово extends, за которым следует
верхние границы
. Чтобы объявить параметр ограниченного типа, мы перечисляем имя параметра типа, за которым следует ключевое слово extends, за которым следуетверхние границы
. Чтобы объявить параметр ограниченного типа, мы перечисляем имя параметра типа, за которым следует ключевое слово extends, за которым следует
верхние границы
.
ListAdapter
- означает, что наш ListAdapter будет принимать любой тип (T) и тип либо ViewHolder, либо подкласс ViewHolder . Теперь в нашей реализации мы используем ListAdapter следующим образом:
ListAdapter
- Поскольку
Word ViewHolder
расширяет ViewHolder, он принимается параметром ограниченного типа, который использует ListAdapter.
общедоступный статический класс WordDiff расширяет DiffUtil. Обратный вызов элемента
- Чтобы иметь возможность объяснить это, мы сначала должны поговорить о
Диффузоры
. Diffutils – это служебный класс, который вычисляет разницу между двумя списками и выводит список обновленных операторов, который преобразует первый список во второй. - Difficult использует алгоритм
Eugene W. Myers
diffing для вычисления минимального количества обновлений для преобразования одного списка в другой.
Что такое Diffutils. Обратный вызов элемента?
- Это статический абстрактный вложенный класс внутри DiffUtil, который используется для вычисления разницы между двумя ненулевыми элементами в списке. Затем мы должны реализовать два метода:
1) являются Ли Элементы Одинаковыми(): вызывается для проверки того, имеют ли два элемента одинаковые данные.
2) содержимое одинаковое(): вызывается для проверки того, представляют ли два объекта один и тот же элемент.
Реализация RecyclerView
- Теперь мы должны перейти к основному действию и вставить этот код в метод
setContentView()
.
RecyclerView recyclerView = findViewById(R.id.recyclerview); final WordListAdapter adapter = new WordListAdapter(new WordListAdapter.WordDiff()); recyclerView.setAdapter(adapter); recyclerView.setLayoutManager(new LinearLayoutManager(this));
RecyclerView(R.id.recyclerview);
- Это мы получаем ссылку на наш RecyclerView, чтобы позже мы могли настроить адаптер и менеджер компоновки.
окончательный WordListAdapter WordListAdapter(новый WordListAdapter. WordDiff());
- Это мы создаем экземпляр нашего адаптера. Нашему ListAdapter нужен класс, который будет использоваться для алгоритма diffing, поэтому мы передаем
WordListAdapter. WordDiff()
.
RecyclerView.setAdapter(адаптер);
setAdapter(adapter)
– это то, как мы устанавливаем адаптер в нашем экземпляре RecyclerView.
RecyclerView.setLayoutManager(новый LinearLayoutManager(этот)) ;
- Это необходимо для настройки менеджера компоновки, и для нас мы используем LinearLayoutManager.
это
используется в качестве контекста, который необходим LinearLayoutManager. При работе с activitiesэто
представляет контекст activity. LinearLayoutManager будет отображать наши данные линейным способом.
Запуск приложения
- Последнее, что нам нужно сделать, это запустить наше приложение, чтобы убедиться, что все работает. На данный момент все, что у нас есть, – это пустой экран. Пока приложение не выходит из строя, мы можем считать, что код работает.
- Спасибо вам за то, что нашли время в свой рабочий день, чтобы прочитать этот мой пост в блоге. Если у вас есть какие-либо вопросы или сомнения, пожалуйста, прокомментируйте ниже или свяжитесь со мной по адресу Твиттер .
Оригинал: “https://dev.to/theplebdev/room-database-recyclerview-part-2-21fn”