发表于: 2018-12-18 22:20:04
0 951
一、今天完成的事情
使用RecyclerView时就免不了用到ViewHolder,之前对于ViewHolder没什么概念,只知道它可以节省资源,但具体原理并不清楚。
RecyclerVIew中每一个列表项都是作为一个View子对象显示的,每个View可以是简单的也可以是复杂的。
这里假设每个View都是一个TextView,而且一个屏幕可以显示10个TextView,现在有上百个TextView要显示,那是不是意味着要准备上百个TextView呢?这里涉及到回收利用的思想,并且已经封装成了RecylerView类。RecyclerView可以创建刚刚好充满屏幕的10个视图,用户滑动屏幕切换视图时,上一个视图就被回收利用并且加载下一个将要显示的视图。
RecyclerView的任务就是回收和定位屏幕上的View。
列表项View显示数据涉及Adapter和ViewHolder。
ViewHolder只做一件事,就是容纳View视图。
RecyclerView并不会创建视图,它创建的是ViewHolder,而ViewHolder分别引用着一个个itemView。不过RecyclerView自己也是不直接创建ViewHolder的,这个任务是adapter完成的。Adapter是一个控制器(适配器)对象,从模型层获取数据,然后提供给RecyclerView显示,起到桥梁的作用。
Adapter负责任务有2个:
1.创建必要的ViewHolder;
2.绑定ViewHolder到模型层数据。.
创建Adapter,首先要定义RecyclerView.Adapter,然后由他封装获取的数据。
RecyclerView要视图时,就会去找它的Adapter:
1)先调用Adapter的getItemCount()方法,询问数组列表中的对象数量。
2)RecyclerView调用adapter的createViewHolder(ViewGroup,int)方法创建ViewHolder以及ViewHolder要显示的视图。
3)RecyclerView会传入ViewHolder及其位置,调用onBindViewHolder(ViewGroup,int)方法。adapter会找到目标位置的数据并且绑定到ViewHolder视图上。绑定就是使用模型数据填充视图。
@Override
public int getItemCount() {
return friendList == null ? 0 : friendList.size();
}
@Override
@NonNull
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_contacts, parent, false);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (onItemClickListener != null) {
onItemClickListener.onItemClick((Integer) view.getTag());
}
}
});
return new ContactViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
ContactViewHolder contactViewHolder = (ContactViewHolder) viewHolder;
contactViewHolder.bindData(friendList.get(position));
contactViewHolder.itemView.setTag(position);
}
经过以上三步,RecyclerView就能在屏幕上显示View了,另外createViewHolder以及onBindViewHolder使用并不频繁。创建了够用的ViewHolder就停止调用了。然后会自动回收旧的ViewHolder来节约时间和节省内存。
二、明天计划的事情
看易教练的代码,主要是即时通讯这一块的实现
三、遇到的问题
四、收获
加深了对RecyclerView中ViewHolder的理解
评论