Официальная документация Android предоставила учебник по созданию RecyclerView в Activity. Однако при попытке создать RecyclerView во фрагменте это немного отличается.

Шаг 1. Создайте проект базовой деятельности

Откройте Android Studio, создайте новый проект - ›выберите Основные действия -› Завершить создание приложения. Запустив приложение на эмуляторе, вы увидите одно приложение-действие с кнопкой, которая позволяет переключаться между двумя фрагментами.

Шаг 2. Создайте ресурс RecyclerView

Мы собираемся создать ресурс RecyclerView в SecondFragment. Перейдите в /res/layout/fragment_second.xml, добавьте следующие строки для создания RecyclerView:

<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/recyclerview"
    android:layout_width="409dp"
    android:layout_height="460dp"
    android:layout_marginStart="1dp"
    android:layout_marginTop="1dp"
    android:layout_marginEnd="1dp"
    android:layout_marginBottom="1dp"
    android:visibility="visible"
    app:layout_constraintBottom_toTopOf="@+id/button_second"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

В качестве альтернативы мы также можем использовать Palette в Android Studio для создания RecyclerView:

  1. Перетащите RecyclerView из палитры в макет в файле fragment_second.xml (используя представление «Дизайн»).
  2. Определите идентификатор RecyclerView как `recyclerview`.
  3. Поскольку он создается в ConstraintLayout, определите Виджет ограничения в 4 направлениях в разделе Макет.

Шаг 3. Создайте FrameLayout с помощью TextView

После создания RecyclerView нам нужно определить ресурс для каждого элемента (TextView) в RecyclerView. Создайте новый файл в папке / res / layout /: frame_textview.xml:

Скопируйте следующие строки в этот новый файл.

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="8dp">

    <TextView
        android:id="@+id/randomText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        tools:text="This is some temp text" />

</FrameLayout>

В качестве альтернативы вы также можете использовать Palette для создания TextView

  1. Перетащите TextView из палитры в макет в frame_textview.xml (используя представление «Дизайн»).
  2. Определите идентификатор TextView как `randomText`

Шаг 4. Добавьте RecyclerView во фрагмент

В разделе recyclerview / SecondFragment.java добавьте следующие строки, чтобы вставить recyclerView во фрагмент. Обратите внимание, что ReyclerView необходимо получать напрямую с помощью view.findViewById () вместо findViewById (). view можно получить из inflater.inflate ().

public class SecondFragment extends Fragment {

    // Add RecyclerView member
    private RecyclerView recyclerView;

    @Override
    public View onCreateView(
            LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState
    ) {

        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_second, container, false);

        // Add the following lines to create RecyclerView
        recyclerView = view.findViewById(R.id.recyclerview);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(view.getContext()));
        recyclerView.setAdapter(new RandomNumListAdapter(1234));

        return view;
    }

Шаг 5: Создайте ViewHolder Recycler

В разделе recyclerview / создайте RecyclerViewHolder.java, добавьте следующие строки, чтобы определить, как создать ViewHolder. Один ViewHolder содержит необходимую информацию пользовательского интерфейса об одном элементе в RecyclerView. В этом примере itemView - это компонент FrameLayout из шага # 3. Нам нужно получить и сохранить TextView randomText из FrameLayout .

package com.google.firebase.recyclerview;

import android.view.View;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

public class RecyclerViewHolder extends RecyclerView.ViewHolder {

    private TextView view;
    public RecyclerViewHolder(@NonNull View itemView) {
        super(itemView);
        view = itemView.findViewById(R.id.randomText);
    }

    public TextView getView(){
        return view;
    }
}

Шаг 6. Создайте RandomNumListAdapter

В разделе recyclerview / создайте RandomNumListAdapter.java, добавьте следующие строки, чтобы определить, как передавать данные в RecyclerView.

Здесь мы хотим показать список случайных чисел в RecyclerView, поэтому мы берем начальное значение случайности в качестве параметра в конструкторе.

В getItemViewType () мы предоставим файл макета, который содержит TextView для элемента списка. В этом примере это frame_textview из шага № 3 .

В onCreateViewHolder () мы берем viewType, который возвращается getItemViewType (). После расширения FrameLayout для получения объекта View мы можем использовать RecyclerViewHolder , созданный на шаге № 5 для возвращаемого значения.

В onBindViewHolder () мы привяжем RecyclerViewHolder к RecyclerView. В этом примере мы сгенерируем случайное число во время выполнения для этого элемента представления. Обратите внимание, что случайное число будет генерироваться каждый раз, когда ViewHolder привязывается к RecyclerView, поэтому мы можем неявно знать, что, если элемент отвязан, и снова привязывается в той же позиции.

package com.google.firebase.recyclerview;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.Random;

public class RandomNumListAdapter extends RecyclerView.Adapter<RecyclerViewHolder> {
    private Random random;

    public RandomNumListAdapter(int seed) {
        this.random = new Random(seed);
    }

    @Override
    public int getItemViewType(final int position) {
        return R.layout.frame_textview;
    }

    @NonNull
    @Override
    public RecyclerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        View view = LayoutInflater.from(parent.getContext()).inflate(viewType, parent, false);
        return new RecyclerViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerViewHolder holder, int position) {
        holder.getView().setText(String.valueOf(random.nextInt()));
    }

    @Override
    public int getItemCount() {
        return 100;
    }
}

Результат: RecyclerView со списком случайных чисел

Теперь все изменения кода выполнены, снова запустите приложение и нажмите кнопку ДАЛЕЕ на эмуляторе. Если вы видите список случайных чисел, как показано ниже, поздравляем! В этом фрагменте вы создали RecyclerView!

Если вы прокрутите RecyclerView вниз, вы увидите больше случайных чисел. И если вы прокрутите вверх, вы обнаружите, что числа отличаются от числа на той же позиции ранее. Это связано с тем, что элемент просмотра за пределами экрана будет автоматически переработан и привязан как другой элемент просмотра, находящийся в данный момент на экране. Каждый раз, когда элемент привязывается к RecyclerView, это приложение генерирует новое случайное число и устанавливает значение TextView.