实施 DI 时是否应该注入 Viewholder?
Should you inject viewholders when implementing DI?
我目前正在我的项目中使用 dagger2 实现依赖注入,我偶然发现了一些东西,我对在 recyclerview 中处理 viewholders 时最好的方法是什么感到困惑。
通常,我们会像这样创建视图持有者:
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int pos) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_item, parent, false);
return new ViewHolder(view);
}
现在我的问题是,如何注入 ViewHolder?
我什至应该注射它还是应该保留它?
Dagger 2 和其他依赖项注入框架可帮助您编写单一职责 类,通过为您管理构造函数,更易于测试。这是他们的主要优势。
在问题的具体代码中(对于RecyclerView.Adapter
)使用Dagger 2或依赖注入没有额外的收益,可以继续使用new
关键字和膨胀视图的静态工厂:
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int pos) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_item, parent, false);
return new ViewHolder(view);
}
换句话说,您不会通过交换模拟的真实依赖项来测试 ViewHolder
,因此在这里使用 Dagger 2 毫无意义。
如果你想提高可读性,你可以考虑使用数据绑定,你最终会得到这样的东西:
return new ViewHolder(ListItemBinding.inflate(LayoutInflater.from(parent.getContext())));
或者,如果您有一个非常复杂的逻辑来生成 ViewHolder
,您可以将 RecyclerView.Adapter
注入到您的 Activity 中。然后你可以在你的适配器中注入一个 ViewHolderFactory
并使用它来创建视图:
private final Context context;
private final ViewHolderFactory viewHolderFactory;
@Inject
MyAdapter(Context context, ViewHolderFactory viewHolderFactory) {
this.context = context;
this.viewHolderFactory = viewHolderFactory;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int pos) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_item, parent, false);
return ViewHolderFactory.create(view);
}
然后可以轻松地针对 ViewHolderFactory
进行测试,而不是针对重量级适配器。
我目前正在我的项目中使用 dagger2 实现依赖注入,我偶然发现了一些东西,我对在 recyclerview 中处理 viewholders 时最好的方法是什么感到困惑。
通常,我们会像这样创建视图持有者:
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int pos) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_item, parent, false);
return new ViewHolder(view);
}
现在我的问题是,如何注入 ViewHolder? 我什至应该注射它还是应该保留它?
Dagger 2 和其他依赖项注入框架可帮助您编写单一职责 类,通过为您管理构造函数,更易于测试。这是他们的主要优势。
在问题的具体代码中(对于RecyclerView.Adapter
)使用Dagger 2或依赖注入没有额外的收益,可以继续使用new
关键字和膨胀视图的静态工厂:
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int pos) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_item, parent, false);
return new ViewHolder(view);
}
换句话说,您不会通过交换模拟的真实依赖项来测试 ViewHolder
,因此在这里使用 Dagger 2 毫无意义。
如果你想提高可读性,你可以考虑使用数据绑定,你最终会得到这样的东西:
return new ViewHolder(ListItemBinding.inflate(LayoutInflater.from(parent.getContext())));
或者,如果您有一个非常复杂的逻辑来生成 ViewHolder
,您可以将 RecyclerView.Adapter
注入到您的 Activity 中。然后你可以在你的适配器中注入一个 ViewHolderFactory
并使用它来创建视图:
private final Context context;
private final ViewHolderFactory viewHolderFactory;
@Inject
MyAdapter(Context context, ViewHolderFactory viewHolderFactory) {
this.context = context;
this.viewHolderFactory = viewHolderFactory;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int pos) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_item, parent, false);
return ViewHolderFactory.create(view);
}
然后可以轻松地针对 ViewHolderFactory
进行测试,而不是针对重量级适配器。