Рубрики
Без рубрики

База данных комнат. RecyclerView Часть 2

Вступление Эта серия будет посвящена основам Android Room library…. С тегами java, android, tristan.

  • Эта серия будет посвящена основам 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”