为什么RecyclerView.ViewHolder子类构造方法需要调用super(view)?
RecyclerView.ViewHolder构造调用super(view)的原因
你理解的没错,super(view)就是用来调用父类RecyclerView.ViewHolder的构造方法,这么做既有Java语法的强制要求,也和RecyclerView的核心运行逻辑强相关,具体原因如下:
- Java继承语法的硬性要求
RecyclerView.ViewHolder仅提供了唯一一个接收View类型参数的构造方法,没有无参构造方法。按照Java的继承规则,子类构造方法如果没有显式调用父类构造,会默认调用父类的无参构造,父类不存在无参构造时就会编译报错,所以你必须在自定义ViewHolder构造的第一行显式调用super(view)。 - 支撑RecyclerView的核心运行逻辑
父类ViewHolder的构造方法会把你传入的View对象保存为公开的itemView成员变量,整个RecyclerView的运作都依赖这个变量:- 列表的item复用、滚动渲染、点击事件绑定、item动画执行等内置逻辑,都是RecyclerView直接访问
ViewHolder.itemView来完成的,你不把根View传给父类的话,RecyclerView无法获取到item的布局实例,整个列表功能会直接失效 - 日常开发中我们也可以直接调用
ViewHolder.itemView访问item的根布局,不需要自己额外声明变量存储,也是父类构造完成存储的功劳
- 列表的item复用、滚动渲染、点击事件绑定、item动画执行等内置逻辑,都是RecyclerView直接访问
官方示例的完整代码如下:
public static class ViewHolder extends RecyclerView.ViewHolder { private final TextView textView; public ViewHolder(View view) { super(view); textView = (TextView) view.findViewById(R.id.textView); } public TextView getTextView() { return textView; } }
内容的提问来源于stack exchange,提问作者BigChungus
相关产品推荐
相关产品推荐

