一、实现的步骤

1.导包recyclerview包

  1. dependencles{
  2. implementation'androidx.recyclerview:recyclerview:1.1.0'
  3. }

2.创建布局,定义一个主布局,布局样式是Recyclerview。

image.png

3.再定义一个该单元格布局的内容,将内容样式绘制出来

image.png

4.创建数据类,利用封装将数据封装在bean里面

image.png

5.创建集合list,然后利用for循环,将数据bean放在集合里面

image.png

6.创建适配器recyclerview,将适配器的方法实现

image.png

7.在适配器内定义变量数据源和上下文,然后创建该构造方法,

image.png

8.绑定控件,将数据源和上下文传进来,然后放入适配器

image.png

9.实现MyAdapter的各个方法,将页面渲染上去

image.png

10.创建布局样式(线性布局,网格布局,瀑布流等)

image.png

11.recyclerview没有监听,需要自己设置,首先创建一个接口,然后创建接口的对象,再接着我们给外部设置一个监听的方法,将值赋值给接口的对象。

image.png

12.设置监听,获取点击位置

image.png

13.点击之后,设置消息提醒

image.png

二、总体代码

  1. 1.布局activity_main.xml文件
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. >
  6. <androidx.recyclerview.widget.RecyclerView
  7. android:id="@+id/rv_item"
  8. android:layout_width="match_parent"
  9. android:layout_height="match_parent"
  10. />
  11. </LinearLayout>
  1. 2.布局recyclerview_item.xml文件
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="wrap_content"
  4. android:layout_height="wrap_content"
  5. >
  6. <TextView
  7. android:id="@+id/tv_item"
  8. android:layout_width="wrap_content"
  9. android:layout_height="wrap_content"
  10. android:textSize="22sp"
  11. android:textColor="#81D835"
  12. />
  13. </LinearLayout>
  1. 3.MyDataBean文件代码
  1. package com.example.myrecyclerview.bean;
  2. //1.定义变量,封装数据
  3. public class MyDataBean {
  4. private String name;
  5. public String getName() {
  6. return name;
  7. }
  8. public void setName(String name) {
  9. this.name = name;
  10. }
  11. }
  1. 4.MainActivity文件代码
  1. package com.example.myrecyclerview;
  2. import androidx.appcompat.app.AppCompatActivity;
  3. import androidx.recyclerview.widget.GridLayoutManager;
  4. import androidx.recyclerview.widget.LinearLayoutManager;
  5. import androidx.recyclerview.widget.RecyclerView;
  6. import androidx.recyclerview.widget.StaggeredGridLayoutManager;
  7. import android.os.Bundle;
  8. import android.view.View;
  9. import android.widget.Toast;
  10. import com.example.myrecyclerview.adapter.MyAdapter;
  11. import com.example.myrecyclerview.bean.MyDataBean;
  12. import java.util.ArrayList;
  13. import java.util.List;
  14. public class MainActivity extends AppCompatActivity {
  15. private List<MyDataBean> list=new ArrayList<>();
  16. @Override
  17. protected void onCreate(Bundle savedInstanceState) {
  18. super.onCreate(savedInstanceState);
  19. setContentView(R.layout.activity_main);
  20. //2.定义集合,利用for循环,将数据放进集合
  21. for (int i=990;i<2000;i++){
  22. if (i%4!=0){
  23. continue;
  24. }
  25. MyDataBean myDataBean=new MyDataBean();
  26. myDataBean.setName("安卓测试" + i);
  27. list.add(myDataBean);
  28. }
  29. //5.绑定布局的控件
  30. RecyclerView rv_item = findViewById(R.id.rv_item);
  31. //线性布局,水平方向,垂直方向布局
  32. // LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
  33. // rv_item.setLayoutManager(linearLayoutManager);
  34. //网格布局,一定的大小,规整
  35. // GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 3);
  36. // rv_item.setLayoutManager(gridLayoutManager);
  37. //瀑布流,不规整
  38. StaggeredGridLayoutManager staggeredGridLayoutManager =
  39. new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL);
  40. rv_item.setLayoutManager(staggeredGridLayoutManager);
  41. //6.创建适配器,将数据源和上下文传入,然后调用适配器
  42. MyAdapter myAdapter=new MyAdapter(list,this);
  43. rv_item.setAdapter(myAdapter);
  44. //13.点击之后设置消息提醒
  45. myAdapter.setRecyclerItemClickListener(new MyAdapter.OnRecyclerItemClickListener() {
  46. @Override
  47. public void OnRecyclerItemClick(int position) {
  48. Toast.makeText(MainActivity.this, "被点击了"+position, Toast.LENGTH_SHORT).show();
  49. }
  50. });
  51. }
  52. }
  1. 5.MyAdapter文件代码
  1. package com.example.myrecyclerview.adapter;
  2. import android.content.Context;
  3. import android.view.LayoutInflater;
  4. import android.view.View;
  5. import android.view.ViewGroup;
  6. import android.widget.TextView;
  7. import androidx.annotation.NonNull;
  8. import androidx.recyclerview.widget.RecyclerView;
  9. import com.example.myrecyclerview.R;
  10. import com.example.myrecyclerview.bean.MyDataBean;
  11. import java.util.List;
  12. //3.创建适配器,继承recyclerview,创建viewholder类
  13. public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
  14. //4.定义数据源和上下文,创建构造函数
  15. private List<MyDataBean> list;
  16. private Context context;
  17. public MyAdapter(List<MyDataBean> list, Context context) {
  18. this.list = list;
  19. this.context = context;
  20. }
  21. /*
  22. 11.recyclerview没有监听,需要自己设置,首先创建一个接口,然后创建接口的对象,
  23. 再接着我们给外部设置一个监听的方法,将值赋值给接口的对象。
  24. */
  25. public OnRecyclerItemClickListener mOnItemClickListener;
  26. public void setRecyclerItemClickListener(OnRecyclerItemClickListener listener){
  27. mOnItemClickListener=listener;
  28. }
  29. public interface OnRecyclerItemClickListener{
  30. void OnRecyclerItemClick(int position);
  31. }
  32. //7.实现适配器的第一个方法,渲染布局,将布局放入viewholder,返回
  33. @NonNull
  34. @Override
  35. public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
  36. View inflate = LayoutInflater.from(context).inflate(R.layout.recyclerview_item, parent, false);
  37. MyViewHolder myViewHolder=new MyViewHolder(inflate);
  38. return myViewHolder;
  39. }
  40. //9.获取这个控件的值
  41. @Override
  42. public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
  43. holder.tv_item.setText(list.get(position).getName());
  44. }
  45. //10.获取集合的长度,若该集合的数据不为空,则计算该数据的长度
  46. @Override
  47. public int getItemCount() {
  48. return list==null ? 0: list.size();
  49. }
  50. //8.实现viewholder类,在类里面实现控件的绑定
  51. public class MyViewHolder extends RecyclerView.ViewHolder {
  52. private TextView tv_item;
  53. public MyViewHolder(@NonNull View itemView) {
  54. super(itemView);
  55. tv_item = itemView.findViewById(R.id.tv_item);
  56. //12.设置监听,获取点击的位置
  57. itemView.setOnClickListener(new View.OnClickListener() {
  58. @Override
  59. public void onClick(View v) {
  60. if (mOnItemClickListener!=null){
  61. mOnItemClickListener.OnRecyclerItemClick(getAdapterPosition());
  62. }
  63. }
  64. });
  65. }
  66. }
  67. }
  1. 6.效果图:(瀑布流形式)<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/1574587/1622389536882-5b8d055a-6caf-4bec-940a-1223d4ad6bbe.png#clientId=u3b529c25-cb34-4&from=paste&height=612&id=uc153f395&margin=%5Bobject%20Object%5D&name=image.png&originHeight=612&originWidth=900&originalType=binary&size=156405&status=done&style=none&taskId=u1b1d99ee-dc08-4a17-bf95-1ab703f496c&width=900)