Android控件知识点-RecyclerView(全网最详解)

背景:笔者在开发Android 蓝牙通信,需要搜索蓝牙设备并且动态显示,这个时候就需要选取适合的相关视图控件了,最后兜兜转转还是觉得RecyclerView好用一些,本人也是在开发的过程中,搜索了很多的资料作出了如下总结。

简介

RecyclerView简称 RV, 是作为 ListView 和 GridView 的加强版出现的,目的是在有限的屏幕之上展示大量的内容,因此 RecyclerView 的复用机制的实现是它的一个核心部分。RecyclerView可以说是做Android应用开发使用最广的几个控件之一。在最新的的Android版本里是如下导包的
implementation 'com.android.support:recyclerview-v7:27.1.1'

img

改完了build.gradle记得要Sync Now。

一、RecyclerView功能介绍

  • 提供了多种LayoutManager,可轻松实现多种样式的布局
  • 支持局部刷新
  • 已经实现了View的复用,不需要类似if(convertView == null)的实现,而且回收机制更加完善
  • 容易实现添加item、删除item的动画效果
  • 容易实现拖拽、侧滑删除等功能
  • 普通的上下滑动和左右滑动
  • Grid效果上下滑动和左右滑动
  • 瀑布流的上下滑动和左右滑动
  • 添加分割线
  • 去除最后一个item的分割线
  • 添加点击事件
  • 增加和删除item
  • 添加动画
  • 多布局
  • 下拉刷新和上拉加载
  • 添加头布局和脚布局
  • 拖拽排序和侧滑删除
  • 分页加载、上拉加载、添加脚布局DEMO

笔者在这个地方主要用的是动态进行蓝牙设备显示,用列表的形式一行的一行的显示,左右滑动过来。

二、优缺点

优点

可以由名字可知,RecyclerView,回收复用视图,RecyclerView只管回收与复用View,其他的你可以自己去设置,一个类实现一个功能,高度的解耦

img

缺点

RecyclerView实现控制点击、长按事件较为麻烦,需要自己写

这个地方如果用BaseQuickAdapter这个适配器可以极大的弥补这个地方的空缺

三、知识储备

RecylerView高度解耦,一个类实现一块功能,使用前需要先了解一下类

  • LayoutManager

布局管理器,默认提供LinearLayoutManager、GridLayoutManager、StaggeredGridLayoutManager三大类,分别可以实现ListView,GridView以及流式布局的列表效果。

  • Adapter

适配器,适配数据如何显示,通过实现RecyclerView.Adapter接口中的方法实现数据的适配。
同时,RecyclerView的适配器强制要求了我们必须要用Viewholder,让性能得到优化,而且getView方法不需自己写,我们只需要写好Viewholder,View的复用已经封装好了。

  • ItemDecoration

Decoration 的英文意思是装饰物的意思,引申到这里来,肯定也是与 RecyclerView 的界面装饰有关。我们常见的就是分割线和item间距的配置

  • SnapHelper

如果每个Item显示⼀屏、按⻚来显示,可以通过设置此类快速实现,有SnapHelper 、LinearSnapHelper 、PagerSnapHelper这三个类

  • itemAnimator

这个类可以实现item的增删动画,不想设置的话它的默认效果也挺好的

  • ViewHolder

生成子项item的布局

RecyclerViewRecyclerView相关类还需要了解的方法

//1 RecyclerView.setLayoutManager();

//2 RecyclerView.setAdapter();

//3 RecyclerView.setItemAnimator();

//4 RecyclerView.addItemDecoration;

  • setLayoutManager:

​ 必选项,设置 RV 的布局管理器,决定 RV 的显示风格。常用的有线性布局管理器(LinearLayoutManager)、网格布局管理器(GridLayoutManager)、瀑布流布局管理器(StaggeredGridLayoutManager)。

  • setAdapter:

​ 必选项,设置 RV 的数据适配器。当数据发生改变时,以通知者的身份,通知 RV 数据改变进行列表刷新操作。

  • setItemAnimator:

​ 非必选项,设置 RV 中 Item 的动画。

  • addItemDecoration:

​ 非必选项,设置 RV 中 Item 的装饰器,经常用来设置 Item 的分割线。

四、使用步骤

RecyclerView.Adapter适配器

使用步骤:

  • 创建RecyclerView 通常在xml中配置

  • 代码中设置属性

    • 确定布局样式 设置layoutManager
    • 确定数据源–定义一个Adapter实现RecyclerView.Adapter接口中的方法
  • RecyclerView通过接口中的方法访问数据

  • 创建一个类继承于 RecyclerView.ViewHolder,重复利用

  • 重写adapter的接口方法
      getItemCount:确定RecyclerView中有多少个item
       onCreateViewHolder:确定每个item的具体视图
      onBindViewHolder:绑定视图

  • 设置item装饰器 addItemDecoration

    • 系统提供的 DividerItemDecoration 分割线
    • ⾃⼰创建⼀个类继承于ItemDecoration 重写onDraw或者onDrawOver、getItemOffset
  • 如果每个Item显示⼀屏 按⻚来显示 SnapHelper 、LinearSnapHelper 、 PagerSnapHelper

BaseQuickAdapter适配器

使用步骤:

  • 创建RecyclerView 通常在xml中配置

  • 代码中设置属性

    • 确定布局样式 设置setLayoutManager
    • 确定数据源–定义一个Adapter实现RecyclerView.Adapter接口中的方法
  • RecyclerView通过接口中的方法访问数据

  • 创建一个类继承于BaseQuickAdapter ,重复利用

  • 重新写convert方法

  • 可以进行设置点击事件等等一系列的操作

  • setItemAnimator设置动画,然后进行进行setAdapter这就结束了

#五、实例讲解

(1)RecyclerView.Adapter适配器案例

1.实现列表显示

  • activity_main.xml

    其中由于RecyclerView不是内置在系统SDK中,需要把其完整的包名路径写出来

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

img

  • item_test.xml

    这个就是用来显示的一条数据的item

<?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="wrap_content"
    android:background="@color/white"
    android:foreground="?attr/selectableItemBackground"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"
        android:padding="16dp">


        <TextView
            android:id="@+id/textView2"
            android:layout_width="378dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center"
            />
    </LinearLayout>

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="#EEE" />
</LinearLayout>

这里的View就是相当于分割线了,主要是这东西比直接用方法简单多了,还好用

预览

下面我们要写实体类itemdata 这个地方我忘首字母大写了,因为写的急

  • itemdata.java
package com.example.recyclerview;
/**
 * @author W凯
 * @data 2022/9/28
 * @fuction 实体类
 */
public class itemdata   {
    private String name;
    public itemdata(String name ){
        this.name = name;
    }
    public String getName() {
        return name;
    }
}

这里因为我就一个Textview这个一个组件,所以只写了一个变量如果你们想插入图片,或者写的别的,可以多添加几个。

下面就是适配器内容了,现在展示的是没有写点击事件,只是单纯的显示数据,可以让其文字显示就可以~

  • ItemAdapt.java

    package com.example.recyclerview;
    
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.TextView;
    
    import androidx.annotation.NonNull;
    import androidx.recyclerview.widget.RecyclerView;
    
    import java.util.List;
    
    /**
     * @author W凯
     * @data 2022/9/28
     * @fuction 实体类
     */
    
    public class ItemAdapt  extends RecyclerView.Adapter<ItemAdapt.ViewHolder>{
    private List<itemdata> nmitemdata;//数据源
        //ItemAdapt的构造方法,加入了数据源参数,在构造的时候赋值给nmitemdata
        public ItemAdapt(List<itemdata> mitemdata) {
            nmitemdata = mitemdata;
        }
        //静态内部类, 每个条目对应的布局
        static class ViewHolder extends RecyclerView.ViewHolder{
            TextView names;
            public ViewHolder(@NonNull View itemView) {
                super(itemView);
                names = (TextView) itemView.findViewById(R.id.textView2);
    
    
            }
        }
        //用于创建ViewHolder实例,并把加载的布局传入到ViewHolder的构造函数去
        @NonNull
        @Override
        public ItemAdapt.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_test, parent, false);
            ViewHolder holder = new ViewHolder(view);
            return holder;
        }
        //是用于对子项的数据进行赋值,会在每个子项被滚动到屏幕内时执行。position得到当前项的实例
        @Override
        public void onBindViewHolder(@NonNull ItemAdapt.ViewHolder holder, int position) {
            itemdata Itemata = nmitemdata.get(position);
            holder.names.setText(Itemata.getName());
        }
        //返回RecyclerView的子项数目
        @Override
        public int getItemCount() {
            return nmitemdata.size();
        }
    
    
    }
    

这里的大体思想就是

1.将数据源传递进来

2.onCreateViewHolder会被调用,进而创建子视图view,将其实例化,

3.然后将其进行ViewHolder,将子视图里的控件进行实例化

4.onBindViewHolder进行数据绑定,最其控件进行赋值

5.在后面笔者会进行实现点击效果~

下面详细介绍这些方法的一些功能

(1)定义内部类ViewHolder,并继承RecyclerView.ViewHolder。传入的View参数通常是RecyclerView子项的最外层布局。用我的理解,就是将其实例化,后面好操作,比如更好的用java代码进行添加图片,名字。

(2)onCreateViewHolder():

  • 创建ViewHolder时的回调函数
  • 传入 ViewGroup parent 和 int viewType
  • 返回 MyHolder

我的理解就是用于创建ViewHolder实例,并把加载的布局传入到构造函数去,再把ViewHolder实例返回。也就是为了找到这个xml,将其实例化,后面好改这个xml里面控件的一些属性

(3)onBindViewHolder()

  • 绑定ViewHolder时的回调函数
  • 传入 自定义内部类的 holder 和 int position

用于对子项的数据进行赋值,会在每个子项被滚动到屏幕内时执行。position得到当前项的Fruit实例。其中position可以理解为list中item的下标,就像数组一样,每个item都有自己的标识。

(4)getItemCount()

RecyclerView的子项数目。

  • MainActivity.java

    package com.example.recyclerview;
    
    import androidx.appcompat.app.AppCompatActivity;
    import androidx.recyclerview.widget.LinearLayoutManager;
    import androidx.recyclerview.widget.RecyclerView;
    
    import android.os.Bundle;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class MainActivity extends AppCompatActivity {
        private List<itemdata> mitemdata = new ArrayList<>();
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            intintest();//初始化数据
            RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view);//将其实例化
            LinearLayoutManager layoutManager = new LinearLayoutManager(this);
            //竖直方向
            layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
            //设置item显示方法
            recyclerView.setLayoutManager(layoutManager);
            //将数据源传入到适配器里
            ItemAdapt adapter = new ItemAdapt(mitemdata);
            //显示item
            recyclerView.setAdapter(adapter);
        }
    
        /**
         * 初始化
         */
        public void intintest() {
            for (int i = 0; i < 10; i++) {
                itemdata item = new itemdata("W凯");
                mitemdata.add(item);
            }
        }
    }
    

这个里面代码有注解,可以自己看看,笔者这地方是用于蓝牙显示,一行一行的显示不同的蓝牙设备,

运行效果

在这里插入图片描述

2.实现点击事件

​ 因为由于在RecyclerView中没有像listview的OnItemClickListener、OnItemLongClickListener等点击方法,故只能自己创建。

第一种方法在适配器中实现点击效果

在ItemAdapt类中的onBindViewHolder()进行修改

   //是用于对子项的数据进行赋值,会在每个子项被滚动到屏幕内时执行。
    @Override
    public void onBindViewHolder(@NonNull ItemAdapt.ViewHolder holder, @SuppressLint("RecyclerView") int position) {
        itemdata Itemata = nmitemdata.get(position);
        holder.names.setText(Itemata.getName());
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.getInstance(), "" + holder.names.getText()+"  "+position, Toast.LENGTH_SHORT).show();
            }
        });
    }

在这里插入图片描述

实现效果

在这里插入图片描述

如何实现点击选中效果

其实这个不难,我看网上有些人写的是真复杂,都是一个看一个

在这里插入图片描述

  • ItemAdapt 修改后代码
package com.example.recyclerview;

import android.annotation.SuppressLint;
import android.content.Context;
import android.util.Log;
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.List;

/**
 * @author W凯
 * @data 2022/9/28
 * @fuction 实体类
 */

public class ItemAdapt  extends RecyclerView.Adapter<ItemAdapt.ViewHolder>{
    private List<itemdata> nmitemdata;//数据源
    private Context myContext;
    private OnItemClickListener myClickListener;
    public   View mview;

    public   boolean status = false;
    //ItemAdapt的构造方法,加入了数据源参数,在构造的时候赋值给nmitemdata
    public ItemAdapt(List<itemdata> mitemdata) {
        nmitemdata = mitemdata;
    }
    //静态内部类, 每个条目对应的布局
    static class ViewHolder extends RecyclerView.ViewHolder{
        TextView names;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            names = (TextView) itemView.findViewById(R.id.textView2);


        }
    }
    //用于创建ViewHolder实例,并把加载的布局传入到ViewHolder的构造函数去
    @NonNull
    @Override
    public ItemAdapt.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_test, parent, false);
        ViewHolder holder = new ViewHolder(view);
        return holder;
    }
    //是用于对子项的数据进行赋值,会在每个子项被滚动到屏幕内时执行。position得到当前项的实例
    @Override
    public void onBindViewHolder(@NonNull ItemAdapt.ViewHolder holder, @SuppressLint("RecyclerView") int position) {
        itemdata Itemata = nmitemdata.get(position);
        holder.names.setText(Itemata.getName());
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @SuppressLint("ResourceAsColor")
            @Override
            public void onClick(View v) {

                if(status){
                    mview.setBackgroundResource(R.color.white);
                    Log.e("TAG","运行中");
                }
                v.setBackgroundColor(R.color.purple_200);
                mview = v;
                status = true;

                Toast.makeText(MainActivity.getInstance(), "" + holder.names.getText()+"  "+position, Toast.LENGTH_SHORT).show();
            }
        });
//        holder.itemView.setOnClickListener(v -> {
                Toast.makeText(myContext, "" + position, Toast.LENGTH_SHORT).show();
//            myClickListener.OnClick(position);
//        });
    }
    //返回RecyclerView的子项数目
    @Override
    public int getItemCount() {
        return nmitemdata.size();
    }
    public void setOnItemClickListener(OnItemClickListener myClickListener) {
        this.myClickListener = myClickListener;
    }

    interface OnItemClickListener{
        void OnClick(int position);
    }


}

​ 我的思路就是保存上一个view。当点击下个view的时候可以恢复上一个view的颜色,利用status状态让其进行第一次进入点击时先保存上一个view,如果不实现这个会报错,没有给其mview赋值。

实现效果

在这里插入图片描述

在这里插入图片描述

第二种方法在Activitymain中实现点击效果

因为这里改变的地方很多,就把改变的类代码全部放上

  • ItemAdapt
package com.example.recyclerview;

import android.annotation.SuppressLint;
import android.content.Context;
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.List;

/**
 * @author W凯
 * @data 2022/9/28
 * @fuction 实体类
 */

public class ItemAdapt  extends RecyclerView.Adapter<ItemAdapt.ViewHolder>{
    private List<itemdata> nmitemdata;//数据源
    private Context myContext;
    private OnItemClickListener myClickListener;
    //ItemAdapt的构造方法,加入了数据源参数,在构造的时候赋值给nmitemdata
    public ItemAdapt(List<itemdata> mitemdata) {
        nmitemdata = mitemdata;
    }
    //静态内部类, 每个条目对应的布局
    static class ViewHolder extends RecyclerView.ViewHolder{
        TextView names;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            names = (TextView) itemView.findViewById(R.id.textView2);


        }
    }
    //用于创建ViewHolder实例,并把加载的布局传入到ViewHolder的构造函数去
    @NonNull
    @Override
    public ItemAdapt.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_test, parent, false);
        ViewHolder holder = new ViewHolder(view);
        return holder;
    }
    //是用于对子项的数据进行赋值,会在每个子项被滚动到屏幕内时执行。position得到当前项的实例
    @Override
    public void onBindViewHolder(@NonNull ItemAdapt.ViewHolder holder, @SuppressLint("RecyclerView") int position) {
        itemdata Itemata = nmitemdata.get(position);
        holder.names.setText(Itemata.getName());
//        holder.itemView.setOnClickListener(new View.OnClickListener() {
//            @Override
//            public void onClick(View v) {
//                Toast.makeText(MainActivity.getInstance(), "" + holder.names.getText()+"  "+position, Toast.LENGTH_SHORT).show();
//            }
//        });
        holder.itemView.setOnClickListener(v -> {
//                Toast.makeText(myContext, "" + position, Toast.LENGTH_SHORT).show();
            myClickListener.OnClick(position);
        });
    }
    //返回RecyclerView的子项数目
    @Override
    public int getItemCount() {
        return nmitemdata.size();
    }
    public void setOnItemClickListener(OnItemClickListener myClickListener) {
        this.myClickListener = myClickListener;
    }

    interface OnItemClickListener{
        void OnClick(int position);
    }


}
  • MainActivity
package com.example.recyclerview;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Bundle;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;


public class MainActivity extends AppCompatActivity {
    private List<itemdata> mitemdata = new ArrayList<>();
    private static MainActivity instance;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        instance = this;//上下文
        intintest();//初始化数据
        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view);//将其实例化
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        //竖直方向
        layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        //设置item显示方法
        recyclerView.setLayoutManager(layoutManager);
        //将数据源传入到适配器里
        ItemAdapt adapter = new ItemAdapt(mitemdata);
        //显示item
        recyclerView.setAdapter(adapter);
        adapter.setOnItemClickListener(position -> {
            Toast.makeText(this, "" + position, Toast.LENGTH_SHORT).show();
        });
    }

    /**
     * 初始化
     */
    public void intintest() {
        for (int i = 0; i < 10; i++) {
            itemdata item = new itemdata("W凯");
            mitemdata.add(item);
        }
    }
    public static MainActivity getInstance(){
        return instance;
    }
}

这里我们可以看到我们在刚才toast的地方 写了这样一段代码

myClickListener.OnClick(position);

myClickListener在前面定义的private OnItemClickListener myClickListener)调用的我们接口里的方法
通过我们自己写的

    public void setOnItemClickListener(OnItemClickListener myClickListener) {
    
    
        this.myClickListener = myClickListener;
    }

公有方法去给myClickListener附上我们的OnClick方法供onBindViewHolder中的holder.itemView.setOnClickListener调用

​ 这里我的理解就是onBindViewHolder中的setOnClickListener方法调用onClick方法,来获取对应的position,获取的position通过setOnItemClickListener公有方法让其在Activitymain中获取position~

实现效果

在这里插入图片描述

3.修改RecyclerView 显示效果

(1)横向滚动

修改Activitymain里的代码
在这里插入图片描述

//水平方向
layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);

因为我这个item_test布局是LinearLayout布局要修改其大小才可以横着显示,可以根据自己的需要选择不同的布局

在这里插入图片描述

实现效果

在这里插入图片描述

(2)GridLayoutManager(网格布局

修改MainActivity.java

修改 MainActivity.java把

LinearLayoutManager layoutManager = new LinearLayoutManager(this);

layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);

修改成

GridLayoutManager layoutManager = new GridLayoutManager(this,5);

GridLayoutManager (Context context, int spanCount)

参数的意义:

Context: Current context, will be used to access resources.

spanCount int: The number of columns in the grid(网格的列数)

修改代码地方

在这里插入图片描述

GridLayoutManager layoutManager = new GridLayoutManager(this,3);

还是一样的原因要修改item_test布局的大小,设定定值布局大小

在这里插入图片描述

实现效果

大概就是这些啦,后续如果用到别的还是会补充的,但是这些都是基本的,基本的差不多就是这些关于RecyclerView.Adapter适配器的地方。

(2)BaseQuickAdapter适配器案例

这个优点就是可以减少重复代码

需要重新写一个适配器

  • ItemAdapts
package com.example.recyclerview;

import android.annotation.SuppressLint;
import android.view.View;

import androidx.annotation.NonNull;

import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.viewholder.BaseViewHolder;

import java.util.List;

public class ItemAdapts extends BaseQuickAdapter<itemdata, BaseViewHolder> {
    public ItemAdapts(int layoutResId, List<itemdata> data) {
        super(layoutResId, data);
    }
    @Override
    protected void convert(@NonNull BaseViewHolder baseViewHolder, itemdata itemdata) {
        baseViewHolder.setText(R.id.textView2,itemdata.getName());
    }
}

这个适配器写的代码太少了,太感动了,也好用

下面看看Activitymain的变化

  • Activitymain
package com.example.recyclerview;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

import com.chad.library.adapter.base.BaseQuickAdapter;

import java.util.ArrayList;
import java.util.List;


public class MainActivity extends AppCompatActivity {
    private List<itemdata> mitemdata = new ArrayList<>();
    private static MainActivity instance;
    ItemAdapts mItemAdapts;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        instance = this;//上下文
        intintest();//初始化数据
//        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view);//将其实例化
//        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
//        //竖直方向
//        layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
//        //水平方向
//     //   layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
//     //   GridLayoutManager layoutManager = new GridLayoutManager(this,3);
//        //设置item显示方法
//        recyclerView.setLayoutManager(layoutManager);
//        //将数据源传入到适配器里
//        ItemAdapt adapter = new ItemAdapt(mitemdata);
//        //显示item
//        recyclerView.setAdapter(adapter);
        adapter.setOnItemClickListener(position -> {
            Toast.makeText(this, "" , Toast.LENGTH_SHORT).show();
        });

        RecyclerView recyclerView =  findViewById(R.id.recycler_view);//将其实例化
        mItemAdapts = new ItemAdapts(R.layout.item_test,mitemdata);
        mItemAdapts.setOnItemClickListener((adapter, view, position) -> {
            Log.e("TAG","");
        });
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        //启用动画
        mItemAdapts.setAnimationEnable(true);
        //设置动画方式
        mItemAdapts.setAnimationWithDefault(BaseQuickAdapter.AnimationType.SlideInRight);
        // rvDevice.addItemDecoration(new GridSpacingItemDecoration(spanCount, ScreenUtils.dip2px(this, 2), false));
        recyclerView.setAdapter(mItemAdapts);


    }

    /**
     * 初始化
     */
    public void intintest() {
        for (int i = 0; i < 10; i++) {
            itemdata item = new itemdata("W凯");
            mitemdata.add(item);
        }
    }
    public static MainActivity getInstance(){
        return instance;
    }
}

启动动画显示也很方便,这里因为数据是写好的,如果像笔者用的是蓝牙设备显示,设备都是动态显示,看起来蛮不错的,这个主要还是要看源代码,点击事件也是一样的方法进行处理。

运行效果这里就不展示了,一样的~

六、遇到的问题

暂时没遇到

七、总结

这里大概基本的RecycleView就介绍完了,笔者还是会不断的进行更新的,因为像这种千变万化,而笔者总结的是我用到的,还是看自己理解,两种适配器更喜欢第二种,写的少,不容易绕晕了

八、源代码地址

下载地址
csdn :https://download.csdn.net/download/jdaljd/86800058
gitee:https://gitee.com/W-200091/RecyclerView.git

猜你喜欢

转载自blog.csdn.net/jdaljd/article/details/127462418