理解并简单使用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最后几天,继续加油。