RecyclerView全套方案系列一

目录

0、相关视频:

1、简介

2、使用

2.1、添加依赖:

2.2、在布局文件中加入recyclerview

2.3、设置Adapter。

2.4、设置LayoutManager,setLayoutManager

2.5、添加监听事件

2.5.1、直接添加

2.5.2、接口回调的方式


0、相关视频:

尚硅谷Android视频《RecyclerView》

相关文章:

RecyclerView(1)-Decoration源码解析(系列文章)

【进阶】RecyclerView源码解析(一)——绘制流程(系列文章)

图文搞懂RecyclerView 的各部分组成 | RecyclerView进阶

深入列表(二),RecycleView 基本原理

1、简介

RecycleView是Listview和GridView的替代者,在support-v7版本中提供支持。

RecycleView架构,提供了一种插拔式的体验,高度的解耦,异常的灵活,通过设置它提供的不同的LayoutManager,ItemDecoration,ItemAnimator实现令人炫目的效果。

Listview和GridView能做的RecycleView都能做,并且能实现瀑布流效果。

2、使用

2.1、添加依赖:

implementation 'com.android.support:recyclerview-v7:27.1.1'
implementation 'androidx.recyclerview:recyclerview:1.0.0'

2.2、在布局文件中加入recyclerview

2.3、设置Adapter。

注意:继承RecyclerView.Adapter<RvAdapter1.ViewHolder1>,需要自己写一个viewholder。

        //设置RecyclerView的适配器
        mAdapter = new RvAdapter1(this, datas);
        recyclerView.setAdapter(mAdapter);

        // 一定要加上这个,否则recyclerView不会显示
        recyclerView.setLayoutManager(new LinearLayoutManager(this,
                LinearLayoutManager.VERTICAL, false));
public class RvAdapter extends RecyclerView.Adapter<RvAdapter.ViewHolder> {
 
    private final Context context;
    private ArrayList<Student> datas;
 
    public RvAdapter(Context context, ArrayList<Student> datas) {
        this.context = context;
        this.datas = datas;
    }
 
    /**
     * 类似于 getView() 创建View 和 ViewHolder
     */
    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View itemView = View.inflate(context, R.layout.item_rv, null);
        return new ViewHolder(itemView);
    }
 
    /**
     * 类似于 getView()绑定数据部分的代码
     * 数据和 View 绑定
     */
    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        //根据位置得到对应的数据
        Student data = datas.get(position);
        holder.tvName.setText(data.getName());
    }
 
    /**
     * 类似于 getCount()
     */
    @Override
    public int getItemCount() {
        return datas.size();
    }
 
    class ViewHolder extends RecyclerView.ViewHolder {
 
        private ImageView ivCoin;
        private TextView tvName;
 
        public ViewHolder(View itemView) {
            super(itemView);
            ivCoin = itemView.findViewById(R.id.iv_coin);
            tvName = itemView.findViewById(R.id.tv_name);
        }
    }
 
 
}
<?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:background="@color/white"
    android:padding="5dp">

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

        <ImageView
            android:id="@+id/iv_coin"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:src="@mipmap/keji03" />

        <TextView
            android:id="@+id/tv_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="5dp"
            android:text="content"
            android:textAllCaps="false"
            android:textColor="#000"/>

    </LinearLayout>


</RelativeLayout>

 

2.4、设置LayoutManager,setLayoutManager

         /**
         * LayoutManager 不写LayoutManager 是不会显示的,该段代码用于设置显示方式:list、grid还        
            是flow
         * new LinearLayoutManager() 设置为list格式
         */
        recyclerView.setLayoutManager(new LinearLayoutManager(this,
                LinearLayoutManager.HORIZONTAL, false));

2.5、添加监听事件

相关文章:给RecyclerView的item添加点击监听事件

使用接口回调的方法为Recycleview 的item 添加点击监听事件

2.5.1、直接添加

一种是直接给item设置一个id,然后按照正常的流程在adapter里面给item添加方法setOnclickListener()。

     /**
     * 类似于 getView()绑定数据部分的代码
     * 数据和 View 绑定
     */
    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        //根据位置得到对应的数据
        Student data = datas.get(position);
        holder.tvName.setText(data.getName());
        // 直接添加监听时间
        holder.ll.setOnClickListener(v -> LogUtils.d("点击了 " + position));
    }

2.5.2、接口回调的方式

2.5.2.1、首先定义一个接口的方法

     /**
     * 创建一个回调接口
     */
    public interface MyItemClickListener {
        void onItemClick(View view, int position);
    }

2.5.2.2、在adapter中初始化接口

private MyItemClickListener mItemClickListener;

2.5.2.3、在onBindViewHolder中将item点击事件接口传递进去,让接口方法去处理点击事件的逻辑


    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        //根据位置得到对应的数据
        Student data = datas.get(position);
        holder.tvName.setText(data.getName());

        holder.itemView.setOnClickListener(v -> {
            if (mItemClickListener != null) {
                mItemClickListener.onItemClick(v, position);
            }
        });
    }

2.5.2.4、定义一个接口回调的方法给外部调用 

A、这里面常用的写法有写一个带参数的set 方法将第二步定义的接口对象传递进去

     /**
     * 在activity的adapter就是调用这个方法将点击事件传递过来,并赋值给全局监听
     * @param myItemClickListener 接口
     */
    public void setItemClickListener(MyItemClickListener myItemClickListener) {
        this.mItemClickListener = myItemClickListener;
    }

    然后在acitvity 中通过adapter 的对象去回调
    rvAdapter.setItemClickListener((view, position) -> {
            LogUtils.d("点击了 " + position);
    });

B、或者将OnItemClickListener 接口对象传到adapter的构造函数中去,这样只要实例化adapter对象就会回调了。

public RvAdapter(Context context, ArrayList<Student> datas, MyItemClickListener listener) {
        this.context = context;
        this.datas = datas;
        this.mItemClickListener = listener;
    }

// 调用
RvAdapter rvAdapter2 = new RvAdapter(this, mDataList, new RvAdapter.MyItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {
                LogUtils.d("点击了 " + position);
            }
        });
rvList.setAdapter(rvAdapter2);
public class RvAdapter extends RecyclerView.Adapter<RvAdapter.ViewHolder> {

    private final Context context;
    private ArrayList<Student> datas;
    private MyItemClickListener mItemClickListener;

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

    public RvAdapter(Context context, ArrayList<Student> datas, MyItemClickListener listener) {
        this.context = context;
        this.datas = datas;
        this.mItemClickListener = listener;
    }

    /**
     * 类似于 getView() 创建View 和 ViewHolder
     */
    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View itemView = View.inflate(context, R.layout.item_rv, null);
        return new ViewHolder(itemView);
    }

    /**
     * 类似于 getView()绑定数据部分的代码
     * 数据和 View 绑定
     */
    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        //根据位置得到对应的数据
        Student data = datas.get(position);
        holder.tvName.setText(data.getName());

//        holder.ll.setOnClickListener(v -> LogUtils.d("点击了 " + position));

        holder.itemView.setOnClickListener(v -> {
            if (mItemClickListener != null) {
                mItemClickListener.onItemClick(v, position);
            }
        });

    }

    /**
     * 类似于 getCount()
     */
    @Override
    public int getItemCount() {
        return datas.size();
    }

    class ViewHolder extends RecyclerView.ViewHolder {

        private LinearLayout ll;
        private ImageView ivCoin;
        private TextView tvName;

        public ViewHolder(View itemView) {
            super(itemView);
            ll = itemView.findViewById(R.id.ll);
            ivCoin = itemView.findViewById(R.id.iv_coin);
            tvName = itemView.findViewById(R.id.tv_name);
        }
    }

    /**
     * 创建一个回调接口
     */
    public interface MyItemClickListener {
        void onItemClick(View view, int position);
    }

    /**
     * 在activity的adapter就是调用这个方法将点击事件传递过来,并赋值给全局监听
     *
     * @param myItemClickListener 接口
     */
    public void setItemClickListener(MyItemClickListener myItemClickListener) {
        this.mItemClickListener = myItemClickListener;
    }


}
rvList = findViewById(R.id.rvList);

        rvList.setLayoutManager(new LinearLayoutManager(
                this, LinearLayoutManager.VERTICAL, false));

        mDataList = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            Student student = new Student("name" + i, i);
            mDataList.add(student);
        }

        RvAdapter rvAdapter = new RvAdapter(this, mDataList);

        rvList.setAdapter(rvAdapter);

        rvAdapter.setItemClickListener((view, position) -> {
            LogUtils.d("点击了 " + position);
        });

//        RvAdapter rvAdapter2 = new RvAdapter(this, mDataList, new         
                      RvAdapter.MyItemClickListener() {
//            @Override
//            public void onItemClick(View view, int position) {
//                LogUtils.d("点击了 " + position);
//            }
//        });
//        rvList.setAdapter(rvAdapter2);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值