- 跟着郭神的第一行代码学的RecycleView,也用了挺长时间了,但一直都是处于一种懵懂的状态,不理解RecycleView的适配器的各个方法怎么使用和调用的,敲代码时也是不断网上搜方法,ctrl+c/v,在不断的搜索和对比下,我终于搞清楚了RecycleView具体来讲是适配器各方法的基本使用的顺序和作用,在这里我做个浅陋的汇总。
- 首先要使用RecycleView得先建立一个适配器FruitAdapter继承自RecycleView.Adapter父类(适配器说白了也就是一个功能类,包含了实现滚动显示的大部分方法。)(当然在此之前要先创建一个数据类,依赖库我直接添加的第一行代码里的版本),然后就是创建一个继承RecyclerView.ViewHolder的内部类,这个类就一个构造方法,用来实例化RecycleView布局的控件:然后再来定义适配器的构造方法,这个只用来绑定布局
后面就是继承了RecycleView.Adapter后要固定继承的三个方法:
- onCreateViewHolder(View Group parent,int ViewType)
这个方法主要是根据加载进来的RecycleView的布局文件来创建一个ViewHolder实例(对于ViewHolder我的理解是作为一个View的容器,并将通过findviewbyid方法获取的view存放到ViewHolder中,方便下次屏幕滚动时获取,实现itemview的循环利用)最后再把viewholder实例返回。同时也是在这个方法体里边定义点击每个item的逻辑功能的: - onBindViewHolder( ViewHolder holder, int position)
这个方法主要是为每个item进行数据填充,会在每次需要更新view的时候调用相当于在这里将每个item填充好数据后放进viewholder中存储。 - getItemCount()
此方法返回传入数据源的长度,也就是返回多少个列表项。
在每次滑动列表的时候onCreateViewHolde和onBindViewHolder两个方法都会被调用。
下面附具体代码:
public class FruitAdapter extends RecyclerView.Adapter<FruitAdapter.ViewHolder>{
private List<Fruit> mFruitList;
static class ViewHolder extends RecyclerView.ViewHolder{
View fruitView;
ImageView fruitImage;
TextView fruitName;
public ViewHolder(View view){
super(view);
fruitView=view;
fruitImage=(ImageView)view.findViewById(R.id.fruit_image);
fruitName=(TextView)view.findViewById(R.id.fruit_name);
}
}
public FruitAdapter(List<Fruit> fruitList) {
mFruitList=fruitList;
//绑定传入的数据源
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.fruit_item,parent,false);
final ViewHolder holder=new ViewHolder(view);
holder.fruitView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position=holder.getAdapterPosition();
Fruit fruit=mFruitList.get(position);
Toast.makeText(v.getContext(),"你 click view "+fruit.getName(),Toast.LENGTH_SHORT).show();
}
});
holder.fruitImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position=holder.getAdapterPosition();
Fruit fruit=mFruitList.get(position);
Toast.makeText(v.getContext(),"you click image "+fruit.getName(),Toast.LENGTH_SHORT).show();
}
});
return holder;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Fruit fruit=mFruitList.get(position);
holder.fruitImage.setImageResource(fruit.getImageId());
holder.fruitName.setText(fruit.getName());
}
@Override
public int getItemCount() {
return mFruitList.size();
}
}
新手上路,如果哪里有错,欢迎指出。
//———————————————————————————————————————————//
关于recycleview的适配器,我现在有了更深入的理解:
RecyclerView的任务就是回收和定位屏幕上的View。
Adapter是Recycleview用来创建ViewHolder的,RecyclerView并不会创建视图。Adapter是一个控制器(适配器)对象,从模型层获取数据,然后提供给RecyclerView显示,起到桥梁的作用。
ViewHolder只做一件事,就是容纳View视图,类似于一种viewgroup。
流程如下:
- 首先创建Adapter,使其继承RecyclerView.Adapter并将泛型设置成Adapter.ViewHolder。
- 实现Adapter的构造方法,获取将要处理显示的数据。同时创建内部类ViewHolder继承RecyclerView.ViewHolder,它存储了我们要加载的view的所有子view结构,用来实现各个组件的绑定,避免了每次获取数据都需要使用findviewById方法的滥用。 当需要再次展示的话我们就不需要重新加载整个view
- 重写Adapter的getItemCount()方法,询问数组列表中的对象数量。
- 然后重写onCreateViewHolder方法,通过LayoutInflater.from(parent.getContext()).inflate将view绑定为每个条目的布局,创建ViewHolder 实例并将view传入,最后返回。
- RecyclerView会传入ViewHolder及其位置,调用onBindViewHolder(ViewHolder ,int)方法。adapter会找到目标位置的数据并且绑定到ViewHolder视图上。绑定就是使用模型数据填充视图。 同时在onBindViewHolder中设置点击事件,需要注意的是是通过holder.itemView来点击的,因为itemview你可以把它理解成每一个布局,那么就需要对每一个布局进行点击事件的处理。
三个过程完成后,RecyclerView就能在屏幕上显示View了,另外createViewHolder以及onBindViewHolder使用并不频繁。当RecyclerView需要一个新的类型的item的ViewHolder的时候才会调用这个方法,创建够用的ViewHolder就停止调用了(根据屏幕上显示的viewholder对象的数量)。然后会自动回收旧的ViewHolder来节约时间和节省内存。
针对继承RecyclerView.Adapter所定义的泛型,目前还没有搞懂。
/———————————————————————————————————————————/
因为RecyclerView.Adapter源码中指定了泛型的上界,所以同时需要一个ViewHolder继承自RecyclerView.ViewHolder,父类ViewHolder会封装RecyclerView需要的代码,子类需要自己对暴露的抽象方法进行业务代码的添加。