RecyclerView详解

1.简介

RecyclerView是一种新的视图组,目标是为任何基于适配器的视图提供相似的渲染方式。它被作为ListView和GridView控件的继承者,在support-v7中提供支持。
RecyclerView架构,提供了一种插拔式的体验,高度的解耦,异常的灵活,通过设置它提供的不同LayoutManager,ItemDecoration,ItemAnimator实现令人膛目的效果。
总之,ListView和GridView能做的RecyclerView都能做,并且能实现瀑布流效果。

2.效果展示

RecyclerView效果展示

3.使用

  1. 在使用RecyclerView之前,我们需要在build.gradle中引入RecyclerView类
implementation 'com.android.support:recyclerview-v7:21.0.3'
  1. 新建一个类RecyclerViewActivity.java,布局文件为activity_recyclerview.xml
    其中activity_recyclerview.xml如下:设置了一排按钮(添加、删除、List、Grid、flow)和RecyclerView
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <Button
            android:id="@+id/add"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="添加"
            android:textAllCaps="false"/>

        <Button
            android:id="@+id/delete"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="删除"
            android:textAllCaps="false"/>

        <Button
            android:id="@+id/list"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="List"
            android:textAllCaps="false"/>

        <Button
            android:id="@+id/grid"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="Grid"
            android:textAllCaps="false"/>

        <Button
            android:id="@+id/flow"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="Flow"
            android:textAllCaps="false"/>

    </LinearLayout>

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>

长这样:
在这里插入图片描述

在RecyclerViewActivity类中引用这个布局,并编写initView()和initData()方法初始化视图和数据,再添加各个按钮的监听

//布局中的视图
    private Button add,delete,list,grid,flow;
    private RecyclerView recyclerView;
    private MyRecyclerViewAdapter adapter;
    //用来放置数据的集合
    private ArrayList<String> datas;
    /**
     * 初始化数据
     */
    private void initData() {
        //准备数据集合
        datas = new ArrayList<>();
        for(int i = 0;i < 100;i++){
            datas.add("Content_" + i);
        }
    }

    /**
     * 初始化视图
     */
    private void initView() {
        add = findViewById(R.id.add);
        delete = findViewById(R.id.delete);
        list = findViewById(R.id.list);
        grid = findViewById(R.id.grid);
        flow = findViewById(R.id.flow);
        recyclerView = findViewById(R.id.recyclerview);

        add.setOnClickListener(this);
        delete.setOnClickListener(this);
        list.setOnClickListener(this);
        grid.setOnClickListener(this);
        flow.setOnClickListener(this);
    }
  1. 编写item布局:item.recyclerview.xml:ImageView和TextView
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="5dp"
    android:background="#ffffff">

    <LinearLayout
        android:background="#22000000"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="5dp">

        <ImageView
            android:id="@+id/iv_icon"
            android:src="@drawable/nullseach"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>

        <TextView
            android:id="@+id/tv_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Content"
            android:layout_marginLeft="10dp"
            android:textSize="20sp"
            android:layout_gravity="center"
            android:textAllCaps="false"
            android:textColor="#000000"/>

    </LinearLayout>

</RelativeLayout>

长这样:
在这里插入图片描述

4.设置适配器

设置RecyclerView的适配器:新建一个MyRecyclerViewAdapter.java类,继承自RecyclerView.Adapter并传入泛型
编写内部类MyViewHolder继承自RecyclerView.ViewHolder

	class MyViewHolder extends RecyclerView.ViewHolder{
	
        private ImageView iv_icon;
        private TextView tv_title;

        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            iv_icon = itemView.findViewById(R.id.iv_icon);
            tv_title = itemView.findViewById(R.id.tv_title);
        }
    }

构造器并传入数据:

    private final Context context;
    private ArrayList<String> datas;

    public MyRecyclerViewAdapter(Context context, ArrayList<String> datas) {
        this.context = context;
        this.datas = datas;
    }

重写3个方法:onCreateViewHolder()、onBindViewHolder()、getItemCount()

    /**
     * 相当于getView方法中创建View和ViewHolder
     * @param parent
     * @param viewType
     * @return
     */
    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View itemView = View.inflate(context, R.layout.item_recyclerview,null);
        return new MyViewHolder(itemView);
    }

    /**
     * 相当于getView方法中数据和View绑定
     * @param holder
     * @param position
     */
    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        //根据位置得到对应的数据
        String data = datas.get(position);
        holder.tv_title.setText(data);
    }

    /**
     * 得到总条数
     * @return
     */
    @Override
    public int getItemCount() {
        return datas.size();
    }

5.设置ListView、GridView和瀑布流效果

RecyclerView通过设置LayoutManager来实现不同的展示效果

  • List效果
    第一个参数时传入的this当前对象,第二个参数是布局的方向(垂直或水平),第三个参数是是否逆序
recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL,false));
  • Grid效果
    第一个参数是传入的this当前对象,第二个参数是列数,第三个参数是布局的方向(垂直或水平),第四个参数是是否逆序
recyclerView.setLayoutManager(new GridLayoutManager(this,2,GridLayoutManager.VERTICAL,false));
  • flow效果
    第一个参数是列数,第二个参数是布局的方向(垂直或水平)
recyclerView.setLayoutManager(new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL));

6.设置分割线、自定义设置item的点击事件

设置分割线(默认的样式,可自定义):

//添加RecyclerView的分割线
        recyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL));

设置item的点击事件

    /**
     * 对各个按钮进行监听
     * @param v
     */
    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.add:
                adapter.addData(0,"new_content");
                recyclerView.scrollToPosition(0);
                break;
            case R.id.delete:
                adapter.removeData(0);
                break;
            case R.id.list:
                //设置ListView类型效果
                recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL,false));
                break;
            case R.id.grid:
                //设置GridView类型效果
                recyclerView.setLayoutManager(new GridLayoutManager(this,2,GridLayoutManager.VERTICAL,false));
                break;
            case R.id.flow:
                //设置瀑布流类型效果
                recyclerView.setLayoutManager(new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL));
                break;
        }
    }
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(context, "data==" + datas.get(getLayoutPosition()), Toast.LENGTH_SHORT).show();
                }
            });

            iv_icon.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(context,"我是图片==" + datas.get(getLayoutPosition()),Toast.LENGTH_LONG).show();
                }
            });

7.增加和删除数据并添加动画

    /**
     * 添加数据
     * @param position  添加数据的位置
     * @param data  添加的数据内容
     */
    public void addData(int position, String data) {
        datas.add(position,data);
        //刷新适配器
        notifyItemInserted(position);
    }

    /**
     * 移除数据
     * @param position
     */
    public void removeData(int position) {
        datas.remove(position);
        //刷新适配器
        notifyItemRemoved(position);
    }

添加动画(默认的,可自定义):

		//设置动画
        recyclerView.setItemAnimator(new DefaultItemAnimator());

8.完整代码

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

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <Button
            android:id="@+id/add"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="添加"
            android:textAllCaps="false"/>

        <Button
            android:id="@+id/delete"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="删除"
            android:textAllCaps="false"/>

        <Button
            android:id="@+id/list"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="List"
            android:textAllCaps="false"/>

        <Button
            android:id="@+id/grid"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="Grid"
            android:textAllCaps="false"/>

        <Button
            android:id="@+id/flow"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="Flow"
            android:textAllCaps="false"/>

    </LinearLayout>

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>
  • item_recyclerview.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="5dp"
    android:background="#ffffff">

    <LinearLayout
        android:background="#22000000"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="5dp">

        <ImageView
            android:id="@+id/iv_icon"
            android:src="@drawable/nullseach"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>

        <TextView
            android:id="@+id/tv_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Content"
            android:layout_marginLeft="10dp"
            android:textSize="20sp"
            android:layout_gravity="center"
            android:textAllCaps="false"
            android:textColor="#000000"/>

    </LinearLayout>

</RelativeLayout>
  • RecyclerViewActivity.java
package com.swpuiot.test.test4;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.StaggeredGridLayoutManager;

import com.swpuiot.test.R;

import java.util.ArrayList;

public class RecyclerViewActivity extends AppCompatActivity implements View.OnClickListener {

    //布局中的视图
    private Button add,delete,list,grid,flow;
    private RecyclerView recyclerView;
    private MyRecyclerViewAdapter adapter;
    //用来放置数据的集合
    private ArrayList<String> datas;

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

        ActionBar actionBar = getSupportActionBar();
        actionBar.setTitle("RecyclerView测试");

        //初始化视图
        initView();
        //初始化数据
        initData();
        //设置RecyclerView的适配器
        adapter = new MyRecyclerViewAdapter(RecyclerViewActivity.this,datas);
        recyclerView.setAdapter(adapter);
        //设置RecyclerView的LayoutManager
        recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL,false));

        //添加RecyclerView的分割线
        recyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL));

        //设置动画
        recyclerView.setItemAnimator(new DefaultItemAnimator());
    }

    /**
     * 初始化数据
     */
    private void initData() {
        //准备数据集合
        datas = new ArrayList<>();
        for(int i = 0;i < 100;i++){
            datas.add("Content_" + i);
        }
    }

    /**
     * 初始化视图
     */
    private void initView() {
        add = findViewById(R.id.add);
        delete = findViewById(R.id.delete);
        list = findViewById(R.id.list);
        grid = findViewById(R.id.grid);
        flow = findViewById(R.id.flow);
        recyclerView = findViewById(R.id.recyclerview);

        add.setOnClickListener(this);
        delete.setOnClickListener(this);
        list.setOnClickListener(this);
        grid.setOnClickListener(this);
        flow.setOnClickListener(this);
    }

    /**
     * 对各个按钮进行监听
     * @param v
     */
    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.add:
                adapter.addData(0,"new_content");
                recyclerView.scrollToPosition(0);
                break;
            case R.id.delete:
                adapter.removeData(0);
                break;
            case R.id.list:
                //设置ListView类型效果
                recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL,false));
                break;
            case R.id.grid:
                //设置GridView类型效果
                recyclerView.setLayoutManager(new GridLayoutManager(this,2,GridLayoutManager.VERTICAL,false));
                break;
            case R.id.flow:
                //设置瀑布流类型效果
                recyclerView.setLayoutManager(new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL));
                break;
        }
    }
}
  • MyRecyclerViewAdapter.java
package com.swpuiot.test.test4;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

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

import com.swpuiot.test.R;

import java.util.ArrayList;

/**
 * Time: 2021/4/10
 * Author: lenovo
 * Description:
 */
public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.MyViewHolder> {

    private final Context context;
    private ArrayList<String> datas;

    public MyRecyclerViewAdapter(Context context, ArrayList<String> datas) {
        this.context = context;
        this.datas = datas;
    }

    /**
     * 相当于getView方法中创建View和ViewHolder
     * @param parent
     * @param viewType
     * @return
     */
    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View itemView = View.inflate(context, R.layout.item_recyclerview,null);
        return new MyViewHolder(itemView);
    }

    /**
     * 相当于getView方法中数据和View绑定
     * @param holder
     * @param position
     */
    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        //根据位置得到对应的数据
        String data = datas.get(position);
        holder.tv_title.setText(data);
    }

    /**
     * 得到总条数
     * @return
     */
    @Override
    public int getItemCount() {
        return datas.size();
    }


    /**
     * 添加数据
     * @param position  添加数据的位置
     * @param data  添加的数据内容
     */
    public void addData(int position, String data) {
        datas.add(position,data);
        //刷新适配器
        notifyItemInserted(position);
    }

    /**
     * 移除数据
     * @param position
     */
    public void removeData(int position) {
        datas.remove(position);
        //刷新适配器
        notifyItemRemoved(position);
    }

    class MyViewHolder extends RecyclerView.ViewHolder{

        private ImageView iv_icon;
        private TextView tv_title;

        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            iv_icon = itemView.findViewById(R.id.iv_icon);
            tv_title = itemView.findViewById(R.id.tv_title);

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(context, "data==" + datas.get(getLayoutPosition()), Toast.LENGTH_SHORT).show();
                }
            });

            iv_icon.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(context,"我是图片==" + datas.get(getLayoutPosition()),Toast.LENGTH_LONG).show();
                }
            });
        }
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值