实施 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 进行测试,而不是针对重量级适配器。