Android的RecyclerView用法和案例使用

 

 

  1. 在使用RecyclerView时候,必须指定一个适配器Adapter和一个布局管理器LayoutManager。
  2. 适配器继承RecyclerView.Adapter类,具体实现类似ListView的适配器,取决于数据信息以及展示的UI。
  3. 布局管理器用于确定RecyclerView中Item的展示方式以及决定何时复用已经不可见的Item,
  4. 避免重复创建以及执行高成本的findViewById()方法。
  5. RecyclerView控件是列表的一种,列表里面的每一个选项可以是纯文字、纯图片、也可以是布局或各种形式数据的混合,为了将各种不同的因素统一调度管理,需要借助于适配器类,其关系流程可参考下图:

  6. 总步骤

    第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次,

 

  1. 展示案例

  2.   

 

代码如下: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);
        }
    }
}

图片素材

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值