【Android】理解并简单使用RecyclerView

理解并简单使用RecyclerView

1.运行截图

在这里插入图片描述

2.RecyclerView和ListView的区别

  • ListView由于其强大的功能,在过去的Android开发当中可以说是贡献卓越,直到今天仍然还有不计其数的程序在继续使用着ListView。不过ListView并不是完全没有缺点的,比如说如果我们不使用一些技巧来提升它的运行效率,那么ListView的性能就会非常差。还有,ListView的扩展性也不够好,它只能实现数据纵向滚动的效果,如果我们想实现横向滚动的话,ListView是做不到的。
  • 为此,Android 提供了一个更强大的滚动控件——RecyclerView。它可以说是一个增强版的ListView,不仅可以轻松实现和ListView同样的效果,还优化了ListView中存在的各种不足之处。目前,程序逐渐从ListView 转向RecyclerView。

3.跟着操作理解

3.1导入依赖

implementation 'androidx.recyclerview:recyclerview:1.1.0'

3.2 在Activity对应的layout中添加RecyclerView

我这里是VideoActivity,所以就在activity_video中添加
在这里插入图片描述

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

3.3根据效果准备素材

因为我这里有图片和文字,所以准备了图片
但是我这里让所有的都使用了同一张图片,你也可以使用一对一的图片,后面用的时候在说。

3.3.1 新建实体类

这里只有两个字段(name和imageId)
在这里插入图片描述

public class Video {
    private String name;
    private int imageId;

    public Video(String name, int imageId) {
        this.name = name;
        this.imageId = imageId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getImageId() {
        return imageId;
    }

    public void setImageId(int imageId) {
        this.imageId = imageId;
    }
}

3.3.2 新建自定义布局item

在layout目录下新建video_item.xml
Imageview的宽和高根据需要自己重新定义。
在这里插入图片描述

<?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:orientation="horizontal">

    <ImageView
        android:id="@+id/video_image"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_margin="20dp" />

    <TextView
        android:id="@+id/video_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_margin="10dp"
        android:textSize="32sp" />

</LinearLayout>

3.4 为RecyclerView准备一个适配器VideoAdapter

新建VideoAdapter类,继承 RecyclerView.Adapter,并将泛型指定为VideoAdapter.ViewHolder。
其中ViewHolder是在VideoAdapter中定义的内部类。
在这里插入图片描述

import android.view.LayoutInflater;
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 java.util.List;


public class VideoAdapter extends RecyclerView.Adapter<VideoAdapter.ViewHolder> {

    private List<Video> videoList;

    //ViewHolder 内部类,继承RecyclerView.ViewHolder
    //在ViewHolder的构造函数中传一个View参数,这个参数通常是RecyclerView子项最外层布局
    public class ViewHolder extends RecyclerView.ViewHolder {
        ImageView videoImage;
        TextView videoName;
        
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            videoImage = itemView.findViewById(R.id.video_image);//获取布局中的videoImage
            videoName = itemView.findViewById(R.id.video_name);
        }
    }

    //传入数据源
    public VideoAdapter(List<Video> videoList1) {
        videoList = videoList1;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        //用于创建ViewHolder
        //在这里加载video_item
        //将加载出来的布局传入构造函数中
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.video_item, parent,false);
        final ViewHolder holder = new ViewHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        //用于对RecyclerView子项的数据进行赋值
        Video video = videoList.get(position);
        holder.videoImage.setImageResource(video.getImageId());
        holder.videoName.setText(video.getName());

    }

    @Override
    public int getItemCount() {
        //告诉RecyclerView共有多少子项
        return videoList.size();
    }
}

3.5使用RecyclerView

在VideoActivity使用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 VideoActivity extends AppCompatActivity {
    private List<Video> videoList = new ArrayList<>();

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

        initVideo();//初始化数据
        RecyclerView recyclerView = findViewById(R.id.recycler_view);
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);
        VideoAdapter adapter = new VideoAdapter(videoList);
        recyclerView.setAdapter(adapter);

    }

       private void initVideo() {//测试的时候可以在这里加个for循环,数据多了便于观看滑动效果
        Video video1 = new Video("脾胃虚寒多吃姜", R.drawable.video);
        videoList.add(video1);
        Video video2 = new Video("睡眠的重要性", R.drawable.video);
        videoList.add(video2);
        Video video3 = new Video("核桃红枣,长生不老", R.drawable.video);
        videoList.add(video3);
        Video video4 = new Video("教你正确吃核桃", R.drawable.video);
        videoList.add(video4);
        Video video5 = new Video("长寿的5个关键要素", R.drawable.video);
        videoList.add(video5);
        Video video6 = new Video("八段锦", R.drawable.video);
        videoList.add(video6);
        Video video7 = new Video("颈椎操", R.drawable.video);
        videoList.add(video7);
        Video video8 = new Video("春季养生", R.drawable.video);
        videoList.add(video8);
    }
}

在这里运行就可以看到效果了,虽然和ListView实现效果一样,但是逻辑变更清晰了。

接下来就添加点击事件。

3.6RecyclerView点击事件

RecyclerView不同于ListView,它并没有提供和ListView一样的setOnItemClickListener()这样的注册注册监听器,而是需要我们自己给子项添加具体的View去注册监听事件。
在这里插入图片描述

holder.videoView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                int position = holder.getAdapterPosition();
                Video video = videoList.get(position);
                Toast.makeText(view.getContext(),"你点击了" + video.getName(), Toast.LENGTH_SHORT).show();
            }
        });

到这里,对RecyclerView的基本使用就结束了。你也可以去实现它横向滚动和瀑布流布局。

知道的越多,不知道的越多。2021最后几天,继续加油。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱笑君吖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值