Android——RecyclerView——ViewHolder——源码注释翻译:ViewHolder的官方
/** * A ViewHolder describes an item view and metadata about its place within the RecyclerView. * * <p>{@link Adapter} implementations should subclass ViewHolder and add fields for caching * potentially expensive {@link View#findViewById(int)} results.</p> * * <p>While {@link LayoutParams} belong to the {@link LayoutManager}, * {@link ViewHolder ViewHolders} belong to the adapter. Adapters should feel free to use * their own custom ViewHolder implementations to store data that makes binding view contents * easier. Implementations should assume that individual item views will hold strong references * to <code>ViewHolder</code> objects and that <code>RecyclerView</code> instances may hold * strong references to extra off-screen item views for caching purposes</p> */
一个ViewHolder描述一个item视图和关于它在RecyclerView中的位置的元数据。
[什么是元数据?]
Adapter的实现需要把ViewHolder作为静态嵌套类,以及需要在ViewHolder类中增加成员变量,用来维护(缓存)item中的通过fvb取得的子视图。
[就像这样的形式]
static class ViewHolder extends RecyclerView.ViewHolder { ImageView imageView; TextView textView; public ViewHolder(View view) { super(view); imageView = (ImageView) view.findViewById(R.id.imageView); textView = (TextView) view.findViewById(R.id.textView); } }
当LayouParams是属于LayoutManager的时候,ViewHolder属于这个Adapter。
[意思就是:ViewHolder父类中内部维护了LayoutParams的变量,如果给RecyclerView设置了LayoutManger(可以理解为LayoutManager就是LayoutParams的一种),这个时候V iewHolder才会和Adapter产生联系。]
Adapter应该可以随意使用他们自己定制的ViewHolder子类来使得 存储绑定视图内容的数据 更轻松。
ViewHolder的子类中的实现你只需要当成对一个item操作即可,你不用忧虑所有的item,ViewHolder父类会自动帮你把另外的item按照你想要的形式去设计。单个item将保持 被ViewHolder对象的强引用
[意思就是ViewHolder的实例会维护单个item],
并且RecyclerView的实例会把屏幕外面的item维护起来,保持一个强引用,其目的是缓存这些视图,为了下次回到屏幕的时候可以不用再次加载。
最后总结一下:ViewHolder是一个帮你免去重复工作的工具,你给他一个模板,给每个模板不同的值,告诉他哪里该绑定什么数据,他会自动帮你做好重复的工作。(当然了, 这是和recyclerView联合工作才能实现的功能)
最通俗的一句话:viewHolder就是view的持有者,实际上就是一个item啊。