- 在使用RecyclerView时候,必须指定一个适配器Adapter和一个布局管理器LayoutManager。
- 适配器继承
RecyclerView.Adapter
类,具体实现类似ListView的适配器,取决于数据信息以及展示的UI。 - 布局管理器用于确定RecyclerView中Item的展示方式以及决定何时复用已经不可见的Item,
- 避免重复创建以及执行高成本的
findViewById()
方法。 - RecyclerView控件是列表的一种,列表里面的每一个选项可以是纯文字、纯图片、也可以是布局或各种形式数据的混合,为了将各种不同的因素统一调度管理,需要借助于适配器类,其关系流程可参考下图:
总步骤
第1步:在页面上添加RecyclerView控件
第2步:通过页面对象的findViewById()方法获取RecyclerView控件
第3步:通过该控件的setLayoutManager()方法设置布局管理器
第4步:准备选项数据
第5步:设计选项布局
第6步:实现适配器RecyclerView.Adapter<>
第7步:通过该控件的setAdapter()方法传入适配器对象
在实现适配器时,需要重写3个方法,如下
ublic class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
/**
* 用于创建一个选项模板
* 参数1:父布局也就是RecyclerView控件。 参数2:选项类型
* **/
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return null;
}
/**
* 用于给选项添加数据
* 参数1:选项模板ViewHolder。 参数2:当前选项在列表里的下标
* **/
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
}
/**用于设置列表选项的个数或长度**/
@Override
public int getItemCount() {
return 0;
}
}
当适配器类被调用后这3个方法会自动执行,他们执行的顺序是:
getItemCount()---> onCreateViewHolder()--->onBindViewHolder()--->getItemCount()
在onCreateViewHolder()方法执行前至少执行getItemCount()方法一次,在onBindViewHolder()执行后至少执行getItemCount()方法一次。有多少个选项,上面的过程就执行多次。如有3个选项, onCreateViewHolder()和onBindViewHolder()方法将会一次执行3次,而getItemCount()方法将会至少被执行>=4次,
- 展示案例
代码如下:activity_main.xml的代码
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.33" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.16142271" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv1"
android:layout_width="130dp"
android:layout_height="452dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/guideline"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/guideline2"
app:layout_constraintVertical_bias="0.22000003" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv2"
android:layout_width="264dp"
android:layout_height="441dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="@+id/guideline"
app:layout_constraintTop_toTopOf="@+id/guideline2"
app:layout_constraintVertical_bias="0.209" />
<TextView
android:id="@+id/textView"
android:layout_width="263dp"
android:layout_height="74dp"
android:layout_marginBottom="24dp"
android:gravity="center"
android:text="世界古书籍列表"
android:textColor="#29C6B8"
android:textSize="24sp"
app:layout_constraintBottom_toTopOf="@+id/guideline2"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.479"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="1.0" />
新建一个.xml文件,命名为item1.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="60dp">
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="TextView"
android:textSize="20sp" />
</LinearLayout>
新建一个.xml文件,命名为item2.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="150dp"
android:background="#B0DCD8">
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.35" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.5" />
<ImageView
android:id="@+id/imageView"
android:layout_width="88dp"
android:layout_height="91dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/guideline3"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@mipmap/books1" />
<TextView
android:id="@+id/textView2"
android:layout_width="178dp"
android:layout_height="59dp"
android:layout_marginStart="12dp"
android:layout_marginLeft="12dp"
android:layout_marginEnd="5dp"
android:layout_marginRight="5dp"
android:gravity="center|left"
android:text="TextView"
android:textColor="#16D3C1"
app:layout_constraintBottom_toTopOf="@+id/guideline4"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="@+id/guideline3"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textView3"
android:layout_width="173dp"
android:layout_height="58dp"
android:layout_marginStart="12dp"
android:layout_marginLeft="12dp"
android:layout_marginEnd="5dp"
android:layout_marginRight="5dp"
android:text="TextView"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="@+id/guideline3"
app:layout_constraintTop_toTopOf="@+id/guideline4" />
</androidx.constraintlayout.widget.ConstraintLayout>
在manActivity添加以下代码
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;
public class MainActivity extends AppCompatActivity {
public static List<List<Book>> list2 =new ArrayList<>();
public static RecyclerView rightrv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
public void initView() {
RecyclerView leftrv = findViewById(R.id.rv1);
leftrv.setLayoutManager(new LinearLayoutManager(MainActivity.this, RecyclerView.VERTICAL, false));
leftrv.addItemDecoration(new DividerItemDecoration(MainActivity.this, RecyclerView.VERTICAL));
List<String> list = new ArrayList<>();
list.add("中华文化");
list.add("两河文化");
list.add("埃及文化");
list.add("南亚文化");
leftrv.setAdapter(new leftMyAdapter(list));
rightrv = findViewById(R.id.rv2);
rightrv.setLayoutManager(new LinearLayoutManager(MainActivity.this, RecyclerView.VERTICAL, false));
rightrv.addItemDecoration(new DividerItemDecoration(MainActivity.this, RecyclerView.VERTICAL));
int[] zhonghuaimage = {R.mipmap.books1, R.mipmap.books2, R.mipmap.books3, R.mipmap.books4, R.mipmap.books5};
String[] zhonghuaname = {"《三坟》", "《河图》", "《八卦》", "《黄帝四经》", "《山海经》"};
String[] zhonghuadiscription = {"天皇地皇人皇时期书籍的统称", "中国记载的最古老的一幅宇宙内涵图", "伏羲总结出的事物规律演化算式", "4600年前中国黄帝时期四部重要书籍", "记载了远古时期和4000年前的世界地理人文"};
int[] liangheimage = {R.mipmap.books1, R.mipmap.books2, R.mipmap.books3, R.mipmap.books4, R.mipmap.books5};
String[] lianghename = {"《苏美尔王表》", "《苏鲁巴克箴言》", "《吉尔伽美什史诗》", "《泥板医疗文书》", "《圣经》"};
String[] lianghediscription = {"记载了两河流域众神时代24万多年之间王朝的列表", "5000年前一位苏美尔国王与洪水的故事", "记载了世界大洪水发生前后的故事", "记载了高超的分子生物医学技术", "记载上帝创世造人、大洪水、世间因果的书籍"};
int[] aijiimage = {R.mipmap.books1, R.mipmap.books2, R.mipmap.books3, R.mipmap.books4, R.mipmap.books5};
String[] aijiname = {"《巴勒莫石刻》", "《金字塔文本》", "《普塔霍特普箴言》", "《亚尼墓书》", "《太阳历》"};
String[] aijidiscription = {"记载了4500年前4个埃及早期王朝的历史和文化", "4400年前十位古埃及王室成员墓葬铭文汇编", "对年轻人、父亲对儿子、在位的法老对将来的继任者的教育性忠告", "介绍复活之道与飞船的文书", "根据天狼星和太阳推算的历法"};
int[] nanyaimage = {R.mipmap.books1, R.mipmap.books2, R.mipmap.books3, R.mipmap.books4, R.mipmap.books5};
String[] nanyaname = {"《吠陀经》", "《奥义书》", "《博伽梵之歌》", "《楞严经》", "《华严经》"};
String[] nanyadiscription = {"南亚最古老的记载大自然真理的书籍的总称", "生命本苦,要离苦得乐,需抛弃世俗的知识才行。", "记载了真理的概念定义、宇宙星球的运行、人与神的战争等", "辩论探讨物质与意识、世界的本质起源演化的典籍", "描述世间世外、世界形成、宇宙中各个世界、各种单位、成道之路等"};
List<Book> zhonghua=getList(zhonghuaimage,zhonghuaname,zhonghuadiscription);
List<Book> liang=getList(liangheimage,lianghename,lianghediscription);
List<Book> aiji=getList(aijiimage,aijiname,aijidiscription);
List<Book> nanya=getList(nanyaimage,nanyaname,nanyadiscription);
list2.add(zhonghua);
list2.add(liang);
list2.add(aiji);
list2.add(nanya);
rightrv.setAdapter(new rightMyAdapter(zhonghua));
}
private List<Book> getList(int []image,String [] name,String [] message){
List<Book> list=new ArrayList<>();
Book book;
for(int i = 0; i<image.length; i++) {
book = new Book();
book.setImage(image[i]);
book.setName(name[i]);
book.setMessage(message[i]);
list.add(book);
}
return list;
}
}
新建一个Java类,命名为Book
public class Book {
private int image;
private String name;
private String message;
public int getImage() {
return image;
}
public void setImage(int image) {
this.image = image;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
新建一个Java类,命名为leftMyAdapter
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;
public class leftMyAdapter extends RecyclerView.Adapter<leftMyAdapter.ViewHolder> {
private List<ViewHolder> items=new ArrayList<>();//用于保存选项
private List<String> list;
public leftMyAdapter(List<String>list){
this.list=list;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.item1,parent,false);
ViewHolder holder=new ViewHolder(view); //创建选项模板
return holder; //把选项模板返回给适配器类
}
@Override
public void onBindViewHolder(@NonNull final ViewHolder holder, final int position) {
final String data=list.get(position); //根据选项下标,安排对应数据。
holder.tv.setText(data);
items.add(holder);//添加选项
//设置初始颜色
holder.itemView.setBackgroundColor(Color.rgb(0,150,136));
holder.tv.setTextColor(Color.rgb(255,255,255));
if(position==0){
holder.itemView.setBackgroundColor(Color.argb(25,0,150,136));
holder.tv.setTextColor(Color.rgb(0,150,136));
}
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
rightMyAdapter rg=new rightMyAdapter(MainActivity.list2.get(position));
MainActivity.rightrv.setAdapter(rg);
for(int i=0;i<items.size();i++){
items.get(i).itemView.setBackgroundColor(Color.rgb(0,150,136));
items.get(i).tv.setTextColor(Color.rgb(255,255,255));
}
holder.itemView.setBackgroundColor(Color.argb(25,0,150,136));
holder.tv.setTextColor(Color.rgb(0,150,136));
}
});
//把数据放进选项控件里
}
@Override
public int getItemCount() {
return list.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
TextView tv;
public ViewHolder(@NonNull View itemView) {
super(itemView);
tv=itemView.findViewById(R.id.textView1); //获得选项布局里TextView控件
}
}
}
新建一个Java类,命名为rightMyAdapter
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
public class rightMyAdapter extends RecyclerView.Adapter<rightMyAdapter.ViewHolder> {
private List<Book> list;
public rightMyAdapter(List<Book> list){
this.list=list;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.item2,parent,false);
//rightMyAdapter.ViewHolder holder=new rightMyAdapter.ViewHolder(view);//创建选项模板
ViewHolder viewHolder=new ViewHolder(view);
return viewHolder; //把选项模板返回给适配器类
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Book book=list.get(position);
holder.image.setImageResource(book.getImage());
holder.name.setText(book.getName());
holder.message.setText(book.getMessage());
}
@Override
public int getItemCount() {
return list.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
ImageView image;
TextView name;
TextView message;
public ViewHolder(@NonNull View itemView) {
super(itemView);
image=itemView.findViewById(R.id.imageView);
name=itemView.findViewById(R.id.textView2);
message=itemView.findViewById(R.id.textView3);
}
}
}
图片素材