发表于: 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的理解



返回列表 返回列表
评论

    分享到