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

Реализация действия RecyclerView.

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

  • Эта серия будет посвящена основам разработки для Android. Присоединяйтесь ко мне, и давайте попробуем создать и понять несколько интересных вещей. Я использовал [документацию по Android]. Все ресурсы, которые я использовал для создания этого поста, можно найти в ticket note или ЗДЕСЬ . С учетом сказанного давайте просто перейдем к делу.

здесь

Реализация RecyclerView

  • При внедрении RecyclerView внутри действия необходимо выполнить 4 основных шага.

1) Добавьте RecyclerView в XML-файл activity.

2) Создайте отдельный элемент ViewHolder.

3) Внедрение адаптера

4) Инициализация всего, что находится внутри действия

  • Для каждого из четырех шагов я вставлю соответствующий код, а затем мы пройдемся по нему строка за строкой.

Что такое RecyclerView ?

  • Прежде чем мы пойдем дальше, мне нужно убедиться, что мы находимся на одной странице, когда дело доходит до понимания того, что такое RecyclerView. По сути, RecyclerView – это просто представление, ничем не отличающееся от любого другого представления, поэтому мы можем добавить его в XML-файл. Что делает RecyclerView особенным, так это то, что он легко и эффективно отображает большие наборы данных. Все, что нам нужно сделать, это предоставить данные и определить, как выглядит отдельный элемент, а “БИБЛИОТЕКА” RecyclerView (не класс) динамически создает элементы, когда они необходимы. Поэтому всякий раз, когда мы говорим о вызываемом методе, это делает библиотека RecyclerView. Теперь, когда у нас обоих есть четкое представление о том, что такое RecyclerView, давайте двигаться дальше.

1) Добавьте RecyclerView в XML-файл activity.




    


  • Это наша основная деятельность, основная деятельность автоматически создается для нас. Если вы не знакомы со всеми этими странными именами, позвольте мне дать вам небольшое краткое описание. A Constraint Layout – это просто контейнер, который позволяет нам дополнительную настройку, однако на самом деле мы не используем эту настройку. xmlns: означает xml-пространство имен, и именно так мы определяем ресурсы для определенных пространств имен. android , приложение и tools – это все пространства имен и URI, для которых они установлены равными ресурсам, к которым у них есть доступ. Вы можете видеть, что мы устанавливаем ширину и высоту ConstraintLayout равными match_parent, что означает, что они установлены на весь экран. Команда tools:context=". MainActivity" объявляет, какое действие связано с этим XML-файлом по умолчанию.
  • Затем мы переходим к фактическому RecyclerView, добавляем android:id таким образом, мы можем ссылаться на него позже в нашем коде. Ширина и высота макета заданы так, чтобы они соответствовали родительскому, поэтому он будет растягиваться на весь экран.

2) Создайте отдельный элемент ViewHolder.



    



  • Теперь это будет действовать как отдельный элемент. Как я уже говорил ранее, одна из вещей, которые нам нужно сделать, – это создать, как будет выглядеть отдельный элемент. Мы делаем это, создавая новый Файл ресурсов макета . Для этого зайдите в папку ресурсов и нажмите file –> новый –> Файл ресурсов макета . Имя файла может быть любым, каким вы хотите, убедитесь, что полностью удалили значение по умолчанию Корневой элемент затем просто добавьте LinearLayout нажмите ok и у вас должен быть новый файл ресурсов Layout/| . Убедитесь, что для android:orientation=”horizontal” установлено значение horizontal. Это гарантирует, что внедренный вид отображается горизонтально. Также убедитесь, что android:layout_height=”wrap_content” Я считаю, что значение по умолчанию равно match_parent , если вы установите для него значение match_parent , один элемент займет весь экран. Затем добавьте TextView, это то, что будет содержать отдельный элемент для каждой части данных, которые мы предоставляем RecyclerView. Мы даем ему android:id=”@+id/animalName” чтобы мы могли ссылаться на него позже для привязки данных. Также убедитесь, что ширина и высота макета установлены на wrap_content. Это гарантирует, что предмет не больше, чем он должен быть. TextView - это просто представление, которое используется для отображения текста пользователю. LinearLayout - это просто ViewGroup, которая выводит все свои дочерние элементы в одну строку, либо по горизонтали, либо по вертикали, для нас это горизонтально. Давайте двигаться дальше

3) Внедрение адаптера

  • Сначала мы должны начать с четкого определения того, что такое адаптер. Что ж, в библиотеке RecyclerView адаптер обеспечивает привязку набора данных для конкретного приложения к представлениям, которые отображаются в RecyclerView. Теперь давайте углубимся в код.
public class CustomAdapter extends RecyclerView.Adapter {
    private List data;


    public CustomAdapter( List data){
        this.data = data;
    }


    @Override
    public ViewHolder onCreateViewHolder(  ViewGroup parent, int viewType) {
        //this is where we inflate the recycler_view.xml
        View views = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.recycler_view,parent,false);

        return new ViewHolder(views);
    }

    @Override
    public void onBindViewHolder( CustomAdapter.ViewHolder holder, int position) {
        String animal = this.data.get(position);
        holder.myTextView.setText(animal);
    }

    @Override
    public int getItemCount() {
        return data.size();
    }

    public static class ViewHolder extends RecyclerView.ViewHolder{
        TextView myTextView;
        public ViewHolder(View view){
            super(view);
            myTextView = view.findViewById(R.id.animalName);
        }
    }
}

— Это может показаться многовато, но давайте просто не будем торопиться, пройдемся строка за строкой и попытаемся понять, что происходит.

общедоступный класс CustomAdapter расширяет RecyclerView. Адаптер

  • Это общедоступный класс, что означает, что к нему может получить доступ любой желающий. Затем пользовательский адаптер расширяет RecyclerView. Адаптер, ключевое слово extends означает, что он является подклассом RecyclerView. Класс адаптера. <Пользовательский адаптер. ViewHolder> – это то, как мы используем дженерики в Java. Причина, по которой мы должны это сделать, заключается в Параметрах ограниченного типа . Если мы посмотрим на документацию RecyclerView. Адаптер мы находим это RecyclerView. Адаптер расширяет android.recyclerview.widget. расширяет android.recyclerview.widget. RecyclerView. ViewHolder> и это наглядный пример параметров ограниченного типа в Java. Теперь, что это на самом деле говорит о том, что он принимает любой объект ViewHolder или его подкласс. Вскоре мы увидим, что мы действительно создаем подкласс ViewHolder. ЗДЕСЬ приведена ссылка на официальную документацию по параметрам ограниченного типа.

Данные

    private List data;


    public CustomAdapter( List data){
        this.data = data;
    }
  • Это данные, которые наш адаптер будет использовать для создания объектов ViewHolder. Мы создаем личную переменную данных типа List. Мы используем интерфейс списка, чтобы обеспечить нашему коду большую гибкость в отношении того, какие данные мы можем хранить. сообщает компилятору, что мы хотим, чтобы внутри списка были только строки. Затем конструктор, который просто принимает данные и присваивает их интерфейсу private List.

Класс ViewHolder

public static class ViewHolder extends RecyclerView.ViewHolder{
        TextView myTextView;
        public ViewHolder(View view){
            super(view);
            myTextView = view.findViewById(R.id.animalName);
        }
    }
  • С этим блоком кода первые две вещи, которые вы, вероятно, заметили, были: 1) это вложенный класс и 2) он статичен. Итак, сначала давайте начнем с того, почему он вложенный? Что ж, в Java вы вкладываете один класс в другой, потому что вложенный класс тесно связан с внешним классом (что верно для нас). Затем возникает второй вопрос: почему он статичен? Ну, во-первых, следует отметить, что в Java класс может быть статическим только в том случае, если он является вложенным классом. Вложенный статический класс может ссылаться только на другие статические поля из другого класса. Как правило, статический класс используется для удаления некоторой зависимости от внешнего класса. В Android мы делаем его статичным, чтобы предотвратить утечку памяти.

  • Прежде чем мы поговорим о Текстовое представление Я хочу поговорить о вызове super(view) в конструкторе. Почему это есть? В любое время в Java, когда мы расширяем что-то, чем мы являемся с помощью этого класса, конструктор должен выполнить какой-либо вызов super() . Если мы не определим вызов super(), то компилятор Java сделает его за нас. Если вы удалите супер(вид) из нашего кода, вы получите сообщение об ошибке с надписью В ViewHolder нет конструктора по умолчанию , доступного . Это доказывает, что когда мы не определяем наш собственный вызов конструктора, Java делает это за нас. Зачем нам нужен этот вызов конструктора? Вызов super() гарантирует, что наш суперкласс создается перед нашим собственным классом, просто в том случае, если мы используем какие-либо суперметоды или переменные.

  • Теперь давайте поговорим о TextView и почему мы ссылаемся на него. Если вы не знакомы с TextView, это просто представление в Android, которое используется для отображения текста. Мы используем его, потому что, когда создается наш объект ViewHolder , мы хотим иметь ссылку на то, к чему мы привязываем наши данные. Позже вы увидите, как объекты, созданные с помощью этого класса, передаются вокруг методов Adapter , эта демонстрация должна дать вам лучшее понимание того, почему это необходимо. Теперь, что такое view.findViewById(R.id.имя животного); ? Часть представления будет представлять собой расширенное (созданное) представление, которое передается адаптером (подробнее об этом позже). findViewById делает именно то, что он говорит, он находит представление по is id. ok но что такое R.id.название животного ? ‘ R’ означает ресурсы, и это автоматически сгенерированный класс, который содержит все, к чему можно получить доступ внутри нашего файла ресурсов. id.animal Name происходит от того, что мы определили идентификатор в нашем TextView, когда мы создали наш индивидуальный объект ViewHolder.

3 внедренных адаптированных метода

  • теперь, когда мы расширяем RecyclerView. Адаптер<Пользовательский адаптер. ViewHolder> мы должны реализовать 3 метода, почему мы должны это делать? Это происходит потому, что RecyclerView. Адаптер – это абстрактный класс, и когда мы расширяем абстрактный класс, мы должны реализовать все абстрактные методы. Те три метода, которые мы должны реализовать, – это:

1)onCreateViewHolder(родительская группа просмотра, int viewType)

  • RecyclerView вызывает этот метод всякий раз, когда ему необходимо создать новый объект ViewHolder. Что такое объект ViewHolder? В Android объект ViewHolder используется для описания представления элемента в наборе данных RecyclerView. Этот метод создает и инициализирует ViewHolder и связанный с ним view.
@Override
    public ViewHolder onCreateViewHolder(  ViewGroup parent, int viewType) {

        View views = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.recycler_view,parent,false);

        return new ViewHolder(views);
    }
  • Обратите внимание, что в этом методе возвращаемый тип – ViewHolder, что означает, что мы будем возвращать новый экземпляр нашего статического класса ViewHolder. Он также принимает два параметра, первый – родительский. В документации говорится: “ViewGroup, в которую будет добавлен новый вид после того, как он будет привязан к позиции адаптера. ” Для нас я считаю, что родительским элементом является сам RecyclerView, который мы добавили в XML-макет нашей основной деятельности. Второй параметр – viewType, и он представляет тип представления нового создаваемого представления. Но мы им не пользуемся, так что нам не нужно так сильно беспокоиться об этом. Тогда у нас есть раздувание нашего Представления.

Раздувание представления

  • Когда мы говорим “инфляция”, мы имеем в виду, что базовая операционная система Android возьмет XML-файл и превратит его в соответствующие объекты представления. Прежде чем мы сможем использовать наше представление для возврата нового объекта ViewHolder, нам нужно его раздуть, как нам это сделать? Мы делаем это через LayoutInflater в Android.
View views = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.recycler_view,parent,false);
  • LayoutInflater – это основной класс, который используется при создании экземпляров представлений. from используется для получения LayoutInflater из текущего контекста. Текущий контекст получен из parent.getContext() , который является контекстом RecyclerView. контекст просто означает текущее состояние приложения и то, к каким ресурсам оно имеет доступ в этом текущем состоянии жизненного цикла Android. Наконец, inflate() используется для создания иерархии представлений из указанных XML-ресурсов. Это означает, что наше представление для отдельного элемента в RecyclerView наконец создано. R.layout.recycler_view – это XML-файл, который мы создали специально для нашего отдельного модуля в RecyclerView. parent – это RecyclerView и false заключается в том, чтобы указать, что мы не хотим присоединять это представление к родительскому представлению, RecyclerView сделает это за нас автоматически.
  • Наконец, мы создаем экземпляр и возвращаем объект ViewHolder, который будет передан в другие методы адаптера
return new ViewHolder(views);

2) onBindViewHolder (Пользовательский адаптер. Держатель ViewHolder, положение int)

  • RecyclerView вызывает эти методы, чтобы связать ViewHolder с данными. Ему передается текущий объект ViewHolder и позиция в данных.
@Override
    public void onBindViewHolder(CustomAdapter.ViewHolder holder, int position) {
        String animal = this.data.get(position);
        holder.myTextView.setText(animal);
    }
  • Обратите внимание на пользовательский адаптер . ViewHolder именно так мы ссылаемся на вложенный класс в Java, сначала упоминая его внешний класс. Затем мы получаем данные, соответствующие текущей позиции в наборе данных, мы можем это сделать, потому что наши данные представлены в виде ArrayList. Наконец, мы устанавливаем текст в TextView.
holder.myTextView.setText(animal);
  • Если вам интересно, откуда взялся myTextView, посмотрите на класс ViewHolder, который мы создали. Если мы хотим привязать данные к чему-то, мы сначала должны ссылаться на них внутри объекта ViewHolder.

2) getItemCount()

  • RecyclerView вызывает этот метод, чтобы получить размер набора данных. Он также использует этот метод, чтобы узнать, сколько объектов ViewHolder нужно отобразить.
@Override
    public int getItemCount() {
        return data.size();
    }
  • Если вы оставите значение по умолчанию равным 0, то на экране не будут отображаться объекты ViewHolder.

4)Инициализация RecyclerView внутри действия

  • Заключительная часть создания RecyclerView – это инициализация всего в основном действии, так сказать, подключение проводов.
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);// takes a layout resource file
        setContentView(R.layout.activity_main); // this inflates the UI

        //data to populate the data for recyclerView
        ArrayList data=new ArrayList<>();
        for(int i = 0; i< 50;i ++){
            data.add("animal # " + i);
        }
        // Setting the RecyclerView
        RecyclerView recyclerView = findViewById(R.id.example_view);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setAdapter(new CustomAdapter(data));


    }
}
  • Хорошо, давайте рассмотрим это строчка за строчкой. extends AppCompatActivity//просто предоставляет нам доступ к дополнительным функциям внутри системы Android. Затем мы переходим к методу onCreate(), что такое onCreate()? Это метод, который вызывается при создании действия. Именно здесь будет проходить большая часть инициализации действия. Ему передается Bundle , который представляет собой любое ранее сохраненное состояние. У нас нет никакого ранее сохраненного состояния, так что нам не нужно беспокоиться об этом. Затем у нас есть супер-вызов super.onCreate(savedInstanceState) . Суперзвонок предназначен только для того, чтобы убедиться, что суперкласс также создается. setContentView(R.layout.activity_main) - это то, что система Android использует для раздувания вашего XML-файла, связанного с этим действием.
ArrayList data=new ArrayList<>();
        for(int i = 0; i< 50;i ++){
            data.add("animal # " + i);
        }
  • Это мы создаем данные для использования RecyclerView. Все, что мы делаем, это создаем простой ArrayList и используем generics, чтобы сообщить компилятору, что мы используем строки для нашего ArrayList. Затем у нас есть простой цикл Java for, который будет выполняться от 0 до 49, и на каждой итерации цикла for он будет добавлять "animal #" + i где i – это число, представляющее, на какой итерации мы находимся.
  • Затем мы можем приступить к настройке RecyclerView.
 // Setting the RecyclerView
        RecyclerView recyclerView = findViewById(R.id.example_view);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setAdapter(new CustomAdapter(data));
  • Первое, что мы делаем, это получаем ссылку на RecyclerView из его идентификатора, который мы установили ранее. Затем мы устанавливаем LayoutManager, что такое Layout Manager? Ну, он отвечает за измерение и позиционирование просмотров элементов в RecyclerView и за определение политики для того, какие просмотры элементов следует перерабатывать, когда они больше не видны пользователю. Указав LinearLayoutManager, мы создаем вертикальный список для наших элементов и передаем его это который будет действовать как текущий контекст действия
  • Наконец, мы устанавливаем наш пользовательский адаптер и передаем ему наши данные, которые мы создали, которые представляют собой ArrayList строк:
recyclerView.setAdapter(new CustomAdapter(data));
  • Теперь запустите эмулятор и радуйтесь.

– Спасибо всем, ребята!!!!

  • Если вы зашли так далеко, обязательно похлопайте себя по спине, это был долгий путь!!!!!!
  • Спасибо вам за то, что нашли время в свой рабочий день, чтобы прочитать этот мой пост в блоге. Если у вас есть какие-либо вопросы или сомнения, пожалуйста, прокомментируйте ниже или свяжитесь со мной по адресу Твиттер .
  • Также не забудьте проверить мой канал YouTube для получения дополнительных руководств по программированию.

Оригинал: “https://dev.to/theplebdev/recyclerview-activity-implementation-13mg”