Android关于RecycleView中的Adapter详解

什么是Adapter?

Adapter 对象充当AdapterView视图和底层数据之间的桥梁。适配器提供对数据项的访问。Adapter 还负责为android.view.View数据集中的每个项目制作一个。
简单来说,Adapter提供了一个将其他View嵌套进RecycleView的方法,使每个RecycleViewitem遵循自定义的视图。

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

上一篇:Android 面试:事件分发8连问,androidrom移植


下一篇:使用bazel从源代码编译tensorflow踩坑记录