RecyclerView в Android с примером

Опубликовано: 5 Января, 2022

RecyclerView - это ViewGroup, добавленная в студию Android в качестве преемника GridView и ListView. Это улучшение для них обоих, и его можно найти в последних пакетах поддержки v-7. Он был создан, чтобы сделать возможным создание любых списков с макетами XML в качестве элемента, который можно значительно настраивать, одновременно повышая эффективность ListViews и GridViews . Это улучшение достигается за счет повторного использования видов, которые не видны пользователю. Например, если пользователь прокрутил страницу вниз до позиции, где видны элементы 4 и 5; пункты 1, 2 и 3 будут удалены из памяти, чтобы уменьшить потребление памяти.

Реализация : для реализации базового RecyclerView необходимо создать три части, которые предлагают пользователям необходимую степень контроля при создании различных дизайнов по своему выбору.

  1. Макет карты: макет карты - это макет XML, который будет рассматриваться как элемент для списка, созданного RecyclerView.
  2. ViewHolder: ViewHolder - это java-класс, который хранит ссылку на представления макета карточки, которые должны динамически изменяться во время выполнения программы с помощью списка данных, полученных либо из онлайн-баз данных, либо добавленных каким-либо другим способом.
  3. Класс данных: класс данных - это настраиваемый Java-класс, который действует как структура для хранения информации для каждого элемента RecyclerView.

Ниже представлена реализация RecyclerView:

экзамен_card.xml

<!-- XML Code illustrating card layout usage. -->
<? xml version = "1.0" encoding = "utf-8" ?>
< RelativeLayout
android:layout_width = "match_parent"
android:layout_height = "105dp" >
< TextView
android:layout_width = "200dp"
android:id = "@+id/examName"
android:textSize = "16sp"
android:layout_marginStart = "20dp"
android:text = "First Exam"
android:textColor = "@color/black"
android:layout_marginEnd = "20dp"
android:maxLines = "1"
android:layout_marginTop = "15dp"
android:layout_height = "wrap_content" />
< ImageView
android:id = "@+id/examPic"
android:layout_width = "20dp"
android:layout_height = "20dp"
android:layout_below = "@+id/examName"
android:tint = "#808080"
android:layout_marginStart = "20dp"
android:layout_marginTop = "7dp"
app:srcCompat = "@drawable/baseline_schedule_black_36dp" />
< TextView
android:id = "@+id/examDate"
android:layout_toEndOf = "@+id/examPic"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:layout_below = "@+id/examName"
android:layout_marginTop = "5dp"
android:layout_marginEnd = "20dp"
android:layout_marginStart = "10dp"
android:gravity = "center"
android:text = "May 23, 2015"
android:textSize = "16sp" />
< ImageView
android:id = "@+id/examPic2"
android:layout_width = "20dp"
android:layout_height = "20dp"
android:layout_below = "@+id/examDate"
android:tint = "#808080"
android:layout_marginStart = "20dp"
android:layout_marginTop = "7dp"
app:srcCompat = "@drawable/baseline_school_black_36dp" />
< TextView
android:id = "@+id/examMessage"
android:layout_toEndOf = "@+id/examPic2"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:layout_below = "@+id/examDate"
android:layout_marginEnd = "20dp"
android:layout_marginTop = "5dp"
android:layout_marginStart = "10dp"
android:gravity = "center"
android:text = "Best Of Luck"
android:textSize = "16sp" />
< TextView
android:id = "@+id/border2"
android:layout_width = "match_parent"
android:layout_height = "1dp"
android:layout_marginStart = "15dp"
android:layout_marginEnd = "15dp"
android:layout_alignParentBottom = "true"
android:background = "#808080" />
</ RelativeLayout >

экзаменViewHolder.java

// ViewHolder code for RecyclerView
package com.example.admin.example;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.TextView;
public class examViewHolder
extends RecyclerView.ViewHolder {
TextView examName;
TextView examMessage;
TextView examDate;
View view;
examViewHolder(View itemView)
{
super (itemView);
examName
= (TextView)itemView
.findViewById(R.id.examName);
examDate
= (TextView)itemView
.findViewById(R.id.examDate);
examMessage
= (TextView)itemView
.findViewById(R.id.examMessage);
view = itemView
}
}

экзаменData.java

package com.prodigieux.admin.prodigieux;
public class examData {
String name;
String date;
String message;
examData(String name,
String date,
String message)
{
this .name = name;
this .date = date;
this .message = message;
}
}

Чтобы щелкнуть элемент ресайклера:

Чтобы щелкнуть элемент представления ресайклера, передайте экземпляр интерфейса щелчка в конструкторе адаптера.

public class ClickListiner{
  
// here index is index
// of item clicked
public click(int index);
  
}

The Adapter: The adapter is the main code responsible for RecyclerView. It holds all the important methods dealing with the implementation of RecylcerView. The basic methods for a successful implementation are:

  • onCreateViewHolder: which deals with the inflation of the card layout as an item for the RecyclerView.
  • onBindViewHolder: which deals with the setting of different data and methods related to clicks on particular items of the RecyclerView.
  • getItemCount: which Returns the length of the RecyclerView.
  • onAttachedToRecyclerView: which attaches the adapter to the RecyclerView.

Below program illustrates an example of a custom adapter:

ImageGalleryAdapter2.java

private class ImageGalleryAdapter2
    extends RecyclerView.Adapter<examViewHolder> {
  
    List<examData> list
        = Collections.emptyList();
  
    Context context;
    ClickListiner listiner;
  
    public ImageGalleryAdapter2(List<examData> list,
                                Context context,ClickListiner listiner)
    {
        this.list = list;
        this.context = context;
        this.listiner = listiner; 
    }
  
    @Override
    public examViewHolder
    onCreateViewHolder(ViewGroup parent,
                       int viewType)
    {
  
        Context context
            = parent.getContext();
        LayoutInflater inflater
            = LayoutInflater.from(context);
  
        // Inflate the layout
  
        View photoView
            = inflater
                  .inflate(R.layout.card_exam,
                           parent, false);
  
        examViewHolder viewHolder
            = new examViewHolder(photoView);
        return viewHolder;
    }
  
    @Override
    public void
    onBindViewHolder(final examViewHolder viewHolder,
                     final int position)
    {
        final index = viewHolder.getAdapterPosition();
        viewHolder.examName
            .setText(list.get(position).name);
        viewHolder.examDate
            .setText(list.get(position).date);
        viewHolder.examMessage
            .setText(list.get(position).message);
        viewHolder.view.setOnClickListener(new View.OnClickListener() { 
            @Override
            public void onClick(View view) 
            
                listiner.click(index); 
            
        }); 
    }
  
    @Override
    public int getItemCount()
    {
        return list.size();
    }
  
    @Override
    public void onAttachedToRecyclerView(
        RecyclerView recyclerView)
    {
        super.onAttachedToRecyclerView(recyclerView);
    }
  
      
}

RecyclerView Implementation in an activity:

exam.java

package com.example.admin.example;
  
import android.content.Context;
import android.content.Intent;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
  
import com.prolificinteractive
    .materialcalendarview
    .MaterialCalendarView;
  
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
  
public class exam extends AppCompatActivity
    implements NavigationView
                   .OnNavigationItemSelectedListener {
  
    ImageGalleryAdapter2 adapter;
    RecyclerView recyclerView;
    ClickListiner listiner;
  
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_exam);
        Toolbar toolbar
            = (Toolbar)findViewById(R.id.toolbar);
        toolbar.setTitle("");
        setSupportActionBar(toolbar);
  
        List<examData> list = new ArrayList<>();
        list = getData();
  
        recyclerView
            = (RecyclerView)findViewById(
                R.id.recyclerView);
       listiner = new ClickListiner() {
            @Override
            public void click(int index){
         Toast.makeTexT(this,"clicked item index is "+index,Toast.LENGTH_LONG).show();
         }
      };
        adapter
            = new ImageGalleryAdapter2(
                list, getApplication(),listiner);
        recyclerView.setAdapter(adapter);
        recyclerView.setLayoutManager(
            new LinearLayoutManager(exam.this));
    }
  
    @Override
    public void onBackPressed()
    {
        super.onBackPressed();
    }
  
    // Sample data for RecyclerView
    private List<examData> getData()
    {
        List<examData> list = new ArrayList<>();
        list.add(new examData("First Exam",
                              "May 23, 2015",
                              "Best Of Luck"));
        list.add(new examData("Second Exam",
                              "June 09, 2015",
                              "b of l"));
        list.add(new examData("My Test Exam",
                              "April 27, 2017",
                              "This is testing exam .."));
  
        return list;
    }
}

activity_exam.xml

<?xml version="1.0" encoding="utf-8"?>
<ScrollView 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_marginTop="56dp" 
    android:background="#FFFFFF" 
    tools:context=".exam"
  
    <LinearLayout 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:orientation="vertical"
  
        <android.support.v7.widget.RecyclerView 
            android:nestedScrollingEnabled="false" 
            android:id="@+id/recyclerView" 
            android:layout_width="match_parent" 
            android:overScrollMode="never" 
            android:layout_height="wrap_content"/> 
  
    </LinearLayout
</ScrollView>


Output:

Keep in mind, that the drawable mentioned in the XML layouts have to be added to the drawable folder under res of the Android Studio Project and support package v7 should be added as an implementation in the Gradle file of the project for the code to run. The above code uses ScrollView as a parent to RecyclerView and disables the scrolling of the RecyclerView hence making the whole page scroll instead of just the RecyclerView contents.

Attention reader! Don’t stop learning now. Get hold of all the important Java Foundation and Collections concepts with the Fundamentals of Java and Java Collections Course at a student-friendly price and become industry ready. To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.