当前位置:   article > 正文

Android开发——RecyclerView

Android开发——RecyclerView

适配器:

  1. package com.example.myapplication;
  2. import android.content.Context;
  3. import android.view.View;
  4. import android.view.ViewGroup;
  5. import android.widget.TextView;
  6. import androidx.annotation.NonNull;
  7. import androidx.recyclerview.widget.RecyclerView;
  8. import java.util.ArrayList;
  9. public class MyAdapter_rv extends RecyclerView.Adapter<MyAdapter_rv.MyViewHolder>{
  10. private ArrayList<bean> data;
  11. private Context context;
  12. public MyAdapter_rv(ArrayList<bean> data,Context context)
  13. {
  14. this.data=data;
  15. this.context=context;
  16. }
  17. public MyAdapter_rv(@NonNull Context context) {
  18. super();
  19. }
  20. @NonNull
  21. @Override
  22. public MyAdapter_rv.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
  23. View view = View.inflate(context,R.layout.item,null);
  24. return new MyViewHolder(view);
  25. }
  26. @Override
  27. public void onBindViewHolder(@NonNull MyAdapter_rv.MyViewHolder holder, int position) {
  28. holder.tv.setText(data.get(position).getName());
  29. }
  30. @Override
  31. public int getItemCount() {
  32. return data == null ? 0 :data.size();
  33. }
  34. public class MyViewHolder extends RecyclerView.ViewHolder{
  35. private TextView tv;
  36. public MyViewHolder(@NonNull View itemView) {
  37. super(itemView);
  38. tv = itemView.findViewById(R.id.tv);
  39. itemView.setOnClickListener(new View.OnClickListener() {
  40. @Override
  41. public void onClick(View v) {
  42. if(mOnItemClickListener!=null)
  43. {
  44. mOnItemClickListener.onRecyclerItemClick(getAdapterPosition());
  45. }
  46. }
  47. }
  48. );
  49. }
  50. }
  51. private OnRecyclerItemClickListener mOnItemClickListener;
  52. public void setRecyclerItemClickListener(OnRecyclerItemClickListener listener)
  53. {
  54. mOnItemClickListener = listener;
  55. }
  56. public interface OnRecyclerItemClickListener
  57. {
  58. void onRecyclerItemClick(int position);
  59. }
  60. }
  1. 构造方法:

    第一个构造方法用于传入数据源和上下文对象。第二个构造方法是默认的构造方法,没有参数。
  2. onCreateViewHolder()方法:

    该方法用于创建ViewHolder对象,即为RecyclerView中的每个数据项创建视图。在该方法中,通过LayoutInflater将item布局文件实例化为View对象,并传入RecyclerView的父布局中。
  3. onBindViewHolder()方法:

    该方法用于绑定ViewHolder和数据,将数据显示在RecyclerView的每个Item上。在该方法中,通过ViewHolder对象获取到对应的TextView,并设置其文本内容为数据源中对应位置的数据。
  4. getItemCount()方法:

    该方法返回数据源的大小,即RecyclerView需要显示的数据项数量。
  5. MyViewHolder内部类:

    该类是ViewHolder的定义,用于保存每个Item的视图。在构造方法中,获取到Item布局文件中的TextView,并设置点击事件监听器。
  6. OnRecyclerItemClickListener接口:

    该接口定义了RecyclerView的点击事件监听方法。
  7. setRecyclerItemClickListener()方法:

    该方法用于设置RecyclerView的点击事件监听器。

mainActivity.java

  1. package com.example.myapplication;
  2. import android.content.Intent;
  3. import android.os.Bundle;
  4. import android.util.Log;
  5. import android.view.View;
  6. import android.widget.AdapterView;
  7. import android.widget.LinearLayout;
  8. import android.widget.ListView;
  9. import androidx.activity.EdgeToEdge;
  10. import androidx.appcompat.app.AppCompatActivity;
  11. import androidx.core.graphics.Insets;
  12. import androidx.core.view.ViewCompat;
  13. import androidx.core.view.WindowInsetsCompat;
  14. import androidx.recyclerview.widget.GridLayoutManager;
  15. import androidx.recyclerview.widget.LinearLayoutManager;
  16. import androidx.recyclerview.widget.RecyclerView;
  17. import androidx.recyclerview.widget.StaggeredGridLayoutManager;
  18. import java.util.ArrayList;
  19. import java.util.GregorianCalendar;
  20. public class MainActivity extends AppCompatActivity {
  21. private final ArrayList<bean> data = new ArrayList<>();
  22. @Override
  23. protected void onCreate(Bundle savedInstanceState) {
  24. super.onCreate(savedInstanceState);
  25. EdgeToEdge.enable(this);
  26. setContentView(R.layout.activity_main);
  27. ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
  28. Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
  29. v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
  30. return insets;
  31. });
  32. for(int i=0;i<100;i++)
  33. {
  34. bean bn = new bean();
  35. bn.setName("WJH"+i);
  36. data.add(bn);
  37. }
  38. RecyclerView recyclerView = findViewById(R.id.rv);
  39. //LinearLayoutManager linearLayoutManager =new LinearLayoutManager(this);
  40. // recyclerView.setLayoutManager(linearLayoutManager); 垂直布局
  41. //GridLayoutManager gridLayoutManager = new GridLayoutManager(this,3);
  42. //recyclerView.setLayoutManager(gridLayoutManager); 网格布局
  43. StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(3, LinearLayout.VERTICAL);
  44. recyclerView.setLayoutManager(staggeredGridLayoutManager); //瀑布流格式
  45. MyAdapter_rv myAdapter_rv = new MyAdapter_rv(data,this);
  46. recyclerView.setAdapter(myAdapter_rv);
  47. myAdapter_rv.setRecyclerItemClickListener(new MyAdapter_rv.OnRecyclerItemClickListener() {
  48. @Override
  49. public void onRecyclerItemClick(int position) {
  50. // 点击的方法
  51. }
  52. });
  53. }
  54. }
  1. 设置全屏显示:

    使用了EdgeToEdge.enable(this)方法,将应用程序的界面延伸到屏幕的边缘,实现全屏显示效果。
  2. 设置窗口填充:

    使用了ViewCompat.setOnApplyWindowInsetsListener()方法,动态地设置了主布局的padding,以适应系统状态栏和导航栏的高度,确保内容不被遮挡。
  3. 准备数据源:

    使用一个ArrayList来存储数据,即ArrayList<bean> data
  4. 初始化RecyclerView:

    获取到RecyclerView的实例,并设置布局管理器。选择了StaggeredGridLayoutManager作为布局管理器,以实现瀑布流格式的布局,其中new StaggeredGridLayoutManager(3, LinearLayout.VERTICAL)表示每行显示3列,布局方向为垂直。创建了自定义的RecyclerView适配器MyAdapter_rv的实例,并设置到RecyclerView上。通过setRecyclerItemClickListener()方法设置了RecyclerView的点击事件监听器。
  5. 数据源准备:

    通过循环向数据源ArrayList中添加了100个数据项,每个数据项都是一个bean对象,其中bean对象可能是应用程序自定义的一个类,用于封装某种数据。

和ListView的区别

  1. 灵活性:

    RecyclerView 更加灵活,可以通过设置不同的布局管理器实现不同的布局方式,如线性布局、网格布局、瀑布流布局等。而 ListView 只能实现垂直方向的线性布局。
  2. 性能优化:

    RecyclerView 的性能优于 ListView,特别是在数据量较大或需要频繁刷新的情况下。RecyclerView 实现了 ViewHolder 模式和局部刷新机制,可以提高列表的滚动性能和内存使用效率。
  3. 动画支持:

    RecyclerView 内置了对列表项的添加、删除和移动等操作的动画支持,可以方便地实现各种列表动画效果,而 ListView 则相对简单,实现列表动画需要自己处理。
  4. ViewHolder 模式:

    RecyclerView 中,需要显式地实现 ViewHolder 模式,即通过创建一个 ViewHolder 类来缓存视图项的子视图,以提高列表的滚动效率。而 ListView 中,虽然也可以使用 ViewHolder 模式,但在使用上没有 RecyclerView 那么灵活。
  5. 扩展性:

    RecyclerView 的适配器(Adapter)类中提供了更多的回调方法和内部类,使得开发者能够更灵活地定制列表的行为和样式。相比之下,ListView 的适配器类相对简单,扩展性较差。

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/477696
推荐阅读
相关标签
  

闽ICP备14008679号