什么是Adapter?
Adapter 对象充当AdapterView
视图和底层数据之间的桥梁。适配器提供对数据项的访问。Adapter 还负责为android.view.View
数据集中的每个项目制作一个。
简单来说,Adapter提供了一个将其他View嵌套进RecycleView
的方法,使每个RecycleView
的item
遵循自定义的视图。
Adapter的使用
定义 Adapter 时,您需要替换三个关键方法:
-
onCreateViewHolder()
:每当 RecyclerView 需要创建新的 ViewHolder 时,它都会调用此方法。此方法会创建并初始化 ViewHolder 及其关联的 View,但不会填充视图的内容,因为 ViewHolder 此时尚未绑定到具体数据。 -
onBindViewHolder()
:RecyclerView 调用此方法将 ViewHolder 与数据相关联。此方法会提取适当的数据,并使用该数据填充 ViewHolder 的布局。例如,如果 RecyclerView 显示的是一个名称列表,该方法可能会在列表中查找适当的名称,并填充 ViewHolder 的 TextView widget。 -
getItemCount()
:RecyclerView 调用此方法来获取数据集的大小。例如,在通讯簿应用中,这可能是地址总数。RecyclerView 使用此方法来确定什么时候没有更多的列表项可以显示。
下面是一个典型的简单 Adapter
示例,该 Adapter
主要接受初始化时传来的List<user>
数据,同时接受一个自定义点击事件接口。为了使RecycleView
显示List
的内容,需要将List
大小及内容传入Adapter
来显示。
public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.ViewHolder> {
//定义所需传入的参数
private List<User> users;
private Context context;
private OnItemClickListener listener;
//初始化Adapter时传入相关参数
public CustomAdapter(List<User> users,Context context,OnItemClickListener listener) {
this.users = users;
this.context = context;
this.listener = listener;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//使每一个RecycleView中的视图都显示为R.layout.item的样式
return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item,parent,false));
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
//显示当前时间
Date date = new Date();
SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
//设置显示的文本
holder.textView.setText(users.get(position).content);
holder.tv_1.setText(ft.format(date));
//设置每个item长按事件
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
listener.onLongClick(position,users.get(position));
return false;
}
});
//设置点击事件
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
listener.onClick(position,users.get(position));
}
});
}
@Override
public int getItemCount() {
//返回List的大小,使其全部显示
return users.size();
}
class ViewHolder extends RecyclerView.ViewHolder{
private TextView textView,tv_1;
public ViewHolder(@NonNull View itemView) {
super(itemView);
//定位要设置的控件
textView = itemView.findViewById(R.id.tv_content);
tv_1 = itemView.findViewById(R.id.tv_date);
}
}
public interface OnItemClickListener{
//在初始化时获得事件
void onClick(int pos,User user);
void onLongClick(int pos,User user);
}
}
总项目地址请看:记事本app