赞
踩
- package com.example.myapplication;
-
- import android.content.Context;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.TextView;
-
- import androidx.annotation.NonNull;
- import androidx.recyclerview.widget.RecyclerView;
-
- import java.util.ArrayList;
-
- public class MyAdapter_rv extends RecyclerView.Adapter<MyAdapter_rv.MyViewHolder>{
- private ArrayList<bean> data;
- private Context context;
- public MyAdapter_rv(ArrayList<bean> data,Context context)
- {
- this.data=data;
- this.context=context;
- }
- public MyAdapter_rv(@NonNull Context context) {
- super();
- }
- @NonNull
- @Override
- public MyAdapter_rv.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
- View view = View.inflate(context,R.layout.item,null);
- return new MyViewHolder(view);
- }
- @Override
- public void onBindViewHolder(@NonNull MyAdapter_rv.MyViewHolder holder, int position) {
- holder.tv.setText(data.get(position).getName());
- }
-
- @Override
- public int getItemCount() {
- return data == null ? 0 :data.size();
- }
- public class MyViewHolder extends RecyclerView.ViewHolder{
- private TextView tv;
- public MyViewHolder(@NonNull View itemView) {
- super(itemView);
- tv = itemView.findViewById(R.id.tv);
- itemView.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- if(mOnItemClickListener!=null)
- {
- mOnItemClickListener.onRecyclerItemClick(getAdapterPosition());
- }
- }
- }
- );
- }
- }
- private OnRecyclerItemClickListener mOnItemClickListener;
- public void setRecyclerItemClickListener(OnRecyclerItemClickListener listener)
- {
- mOnItemClickListener = listener;
- }
- public interface OnRecyclerItemClickListener
- {
- void onRecyclerItemClick(int position);
- }
- }
构造方法:
第一个构造方法用于传入数据源和上下文对象。第二个构造方法是默认的构造方法,没有参数。onCreateViewHolder()方法:
该方法用于创建ViewHolder对象,即为RecyclerView中的每个数据项创建视图。在该方法中,通过LayoutInflater将item布局文件实例化为View对象,并传入RecyclerView的父布局中。onBindViewHolder()方法:
该方法用于绑定ViewHolder和数据,将数据显示在RecyclerView的每个Item上。在该方法中,通过ViewHolder对象获取到对应的TextView,并设置其文本内容为数据源中对应位置的数据。getItemCount()方法:
该方法返回数据源的大小,即RecyclerView需要显示的数据项数量。MyViewHolder内部类:
该类是ViewHolder的定义,用于保存每个Item的视图。在构造方法中,获取到Item布局文件中的TextView,并设置点击事件监听器。OnRecyclerItemClickListener接口:
该接口定义了RecyclerView的点击事件监听方法。setRecyclerItemClickListener()方法:
该方法用于设置RecyclerView的点击事件监听器。- package com.example.myapplication;
-
- import android.content.Intent;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.View;
- import android.widget.AdapterView;
- import android.widget.LinearLayout;
- import android.widget.ListView;
-
- import androidx.activity.EdgeToEdge;
- import androidx.appcompat.app.AppCompatActivity;
- import androidx.core.graphics.Insets;
- import androidx.core.view.ViewCompat;
- import androidx.core.view.WindowInsetsCompat;
- import androidx.recyclerview.widget.GridLayoutManager;
- import androidx.recyclerview.widget.LinearLayoutManager;
- import androidx.recyclerview.widget.RecyclerView;
- import androidx.recyclerview.widget.StaggeredGridLayoutManager;
-
- import java.util.ArrayList;
- import java.util.GregorianCalendar;
-
- public class MainActivity extends AppCompatActivity {
- private final ArrayList<bean> data = new ArrayList<>();
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- EdgeToEdge.enable(this);
- setContentView(R.layout.activity_main);
- ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
- Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
- v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
- return insets;
- });
- for(int i=0;i<100;i++)
- {
- bean bn = new bean();
- bn.setName("WJH"+i);
- data.add(bn);
- }
-
- RecyclerView recyclerView = findViewById(R.id.rv);
- //LinearLayoutManager linearLayoutManager =new LinearLayoutManager(this);
- // recyclerView.setLayoutManager(linearLayoutManager); 垂直布局
-
- //GridLayoutManager gridLayoutManager = new GridLayoutManager(this,3);
- //recyclerView.setLayoutManager(gridLayoutManager); 网格布局
-
- StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(3, LinearLayout.VERTICAL);
- recyclerView.setLayoutManager(staggeredGridLayoutManager); //瀑布流格式
-
- MyAdapter_rv myAdapter_rv = new MyAdapter_rv(data,this);
- recyclerView.setAdapter(myAdapter_rv);
- myAdapter_rv.setRecyclerItemClickListener(new MyAdapter_rv.OnRecyclerItemClickListener() {
- @Override
- public void onRecyclerItemClick(int position) {
- // 点击的方法
- }
- });
- }
-
- }
设置全屏显示:
使用了EdgeToEdge.enable(this)
方法,将应用程序的界面延伸到屏幕的边缘,实现全屏显示效果。设置窗口填充:
使用了ViewCompat.setOnApplyWindowInsetsListener()
方法,动态地设置了主布局的padding,以适应系统状态栏和导航栏的高度,确保内容不被遮挡。准备数据源:
使用一个ArrayList来存储数据,即ArrayList<bean> data
。初始化RecyclerView:
获取到RecyclerView的实例,并设置布局管理器。选择了StaggeredGridLayoutManager
作为布局管理器,以实现瀑布流格式的布局,其中new StaggeredGridLayoutManager(3, LinearLayout.VERTICAL)
表示每行显示3列,布局方向为垂直。创建了自定义的RecyclerView适配器MyAdapter_rv
的实例,并设置到RecyclerView上。通过setRecyclerItemClickListener()
方法设置了RecyclerView的点击事件监听器。数据源准备:
通过循环向数据源ArrayList中添加了100个数据项,每个数据项都是一个bean
对象,其中bean
对象可能是应用程序自定义的一个类,用于封装某种数据。灵活性:
RecyclerView
更加灵活,可以通过设置不同的布局管理器实现不同的布局方式,如线性布局、网格布局、瀑布流布局等。而 ListView
只能实现垂直方向的线性布局。性能优化:
RecyclerView
的性能优于 ListView
,特别是在数据量较大或需要频繁刷新的情况下。RecyclerView
实现了 ViewHolder 模式和局部刷新机制,可以提高列表的滚动性能和内存使用效率。动画支持:
RecyclerView
内置了对列表项的添加、删除和移动等操作的动画支持,可以方便地实现各种列表动画效果,而 ListView
则相对简单,实现列表动画需要自己处理。ViewHolder 模式:
在RecyclerView
中,需要显式地实现 ViewHolder 模式,即通过创建一个 ViewHolder 类来缓存视图项的子视图,以提高列表的滚动效率。而 ListView
中,虽然也可以使用 ViewHolder 模式,但在使用上没有 RecyclerView
那么灵活。扩展性:
RecyclerView
的适配器(Adapter)类中提供了更多的回调方法和内部类,使得开发者能够更灵活地定制列表的行为和样式。相比之下,ListView
的适配器类相对简单,扩展性较差。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。