适配器:
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的点击事件监听器。
mainActivity.java
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
对象可能是应用程序自定义的一个类,用于封装某种数据。
和ListView的区别
-
灵活性:
RecyclerView
更加灵活,可以通过设置不同的布局管理器实现不同的布局方式,如线性布局、网格布局、瀑布流布局等。而ListView
只能实现垂直方向的线性布局。 -
性能优化:
RecyclerView
的性能优于ListView
,特别是在数据量较大或需要频繁刷新的情况下。RecyclerView
实现了 ViewHolder 模式和局部刷新机制,可以提高列表的滚动性能和内存使用效率。 -
动画支持:
RecyclerView
内置了对列表项的添加、删除和移动等操作的动画支持,可以方便地实现各种列表动画效果,而ListView
则相对简单,实现列表动画需要自己处理。 -
ViewHolder 模式:
在RecyclerView
中,需要显式地实现 ViewHolder 模式,即通过创建一个 ViewHolder 类来缓存视图项的子视图,以提高列表的滚动效率。而ListView
中,虽然也可以使用 ViewHolder 模式,但在使用上没有RecyclerView
那么灵活。 -
扩展性:
RecyclerView
的适配器(Adapter)类中提供了更多的回调方法和内部类,使得开发者能够更灵活地定制列表的行为和样式。相比之下,ListView
的适配器类相对简单,扩展性较差。