RecyclerView基本用法

初识RecyclerView

RecyclerView | Android Developers

A flexible view for providing a limited window into a large data set.

根据数据集显示元素的滚动列表

RecyclerView的特点

  • 优化了ListView
  • ViewHolder----把view封装起来
  • layoutmanager 布局管理器 控制Item的布局方式
  • ItemDecoration 设置Item的间隔样式
  • ItemAnimato 控制Item增删的动画

使用 RecyclerView 创建列表

添加依赖库

打开app包下的build.gradle 找到 dependencies{}
插入以下代码

implementation "androidx.recyclerview:recyclerview:1.1.0"

接着你会发现右上角出现了Sync Now字眼,我们点击他来重新Sync
在这里插入图片描述
依赖库的各个版本可以在官网里找到https://developer.android.com/jetpack/androidx/releases/recyclerview#declaring_dependencies

将RecyclerView添加到布局中

打开我们的activity_main.xml布局文件,将RecyclerView添加到布局中,给他命名为my_re_view

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    
    <androidx.recyclerview.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/my_re_view"
        android:scrollbars="vertical"/>

</LinearLayout>

定义一个名为TextItem的java类

新建java文件,用我们之前所学的java类与构造函数的知识定义一个实体类,定义两个变量,一个是int类型的ImageId,一个是String类型的textId

public class TextItem {

    private int ImageId;
    private String textId;

    public TextItem(int imageId, String textId) {
        ImageId = imageId;
        this.textId = textId;
    }

    public int getImageId() {
        return ImageId;
    }

    public void setImageId(int imageId) {
        ImageId = imageId;
    }

    public String getTextId() {
        return textId;
    }

    public void setTextId(String textId) {
        this.textId = textId;
    }
}

在这里我们为了方便,直接点击code下的generate来偷懒一下,让他自动生成构造函数和getter&setter方法

编写item子布局文件my_item

新建layout.xml文件,命名为my_item
recyclerview中的每一个子项item,因为是模仿聊天界面,所以都简化为由一个图片和一段文字组成

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <ImageView
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:layout_margin="5dp"
        android:layout_weight="1"
        android:id="@+id/image_list"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="15sp"
        android:layout_weight="3"
        android:textColor="#888888"
        android:id="@+id/text_list"/>

</LinearLayout>

写一个MyAdapter添加列表适配器

  • 新建java文件,继承RecyclerView.Adapter 将泛型指定为<MyAdapter.ViewHolder>
  • 定义ViewHolder类,在MyAdapter中创建一个继承RecyclerView.ViewHolder的静态类,传入的View参数通常是RecyclerView的最外层布局
  • 实现onCreateViewHolder()方法,把View封装在ViewHolder中,创建ViewHolder实例
  • 实现onBindViewHolder()方法,对item数据进行赋值,获取position,即当前的TextItem实例
  • 实现getItemCount()方法,返回item数量
package com.example.recyclervtest;

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 MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {

    public MyAdapter(List<TextItem> myList) {
        this.myList = myList;
    }

    private List<TextItem> myList;
    
    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.my_item , parent,false);//把我们写的my_item布局加载进来
        ViewHolder holder = new ViewHolder(view);//获取整个子布局
        return holder;
    }


    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {//子项滚到屏幕内时执行
        TextItem textItem = myList.get(position);//获取position
        holder.image_list.setImageResource(textItem.getImageId());//赋值给imageview和textview
        holder.text_list.setText(textItem.getTextId());
    }

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

    static class ViewHolder extends RecyclerView.ViewHolder {
        ImageView image_list;
        TextView text_list;
        //这是一个静态类 继承自RecyclerView.ViewHolder
        //里面有两个变量和一个构造方法
        //构造方法需要传入一个view参数
        public ViewHolder(View view) {
            super(view);
            image_list = (ImageView) view.findViewById(R.id.image_list);
            text_list = (TextView) view.findViewById(R.id.text_list);
        }
    }
}

修改MainActivity代码

  • 绑定布局id
  • 为recyclerview设置布局管理器
  • 定义InitData方法,将数据添加至list里
  • 将list传进MyAdapter,设置recyclerview的adapter
public class MainActivity extends AppCompatActivity {

    private List<TextItem> myData = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initData();
        RecyclerView recyclerView = findViewById(R.id.my_re_view);//绑定id
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);
        MyAdapter adapter = new MyAdapter(myData);
        recyclerView.setAdapter(adapter);

    }

    protected void initData(){

        TextItem ti1 = new TextItem(R.drawable.pic1,"我是一只柴犬。");
        myData.add(ti1);
        TextItem ti2 = new TextItem(R.drawable.pic2,"柴犬最可爱啦!");
        myData.add(ti2);
        TextItem ti3 = new TextItem(R.drawable.pic3,"我爱柴犬!");
        myData.add(ti3);
        TextItem ti4 = new TextItem(R.drawable.pic4,"我是最可爱的柴犬秋菊!");
        myData.add(ti4);
        TextItem ti5 = new TextItem(R.drawable.pic5,"你好!我是泡芙。");
        myData.add(ti5);
        TextItem ti6 = new TextItem(R.drawable.pic6,"我是小短腿柯基呀!");
        myData.add(ti6);
    }
}

好啦!这样我们的超低配聊天页面就完成了!
在这里插入图片描述


版权声明:本文为wasabidragon原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。