【问题标题】:Should you inject viewholders when implementing DI?在实现 DI 时是否应该注入视图?
【发布时间】:2017-08-18 04:58:36
【问题描述】:

我目前在我的项目中使用 dagger2 实现依赖注入,我偶然发现了一些东西,我对在回收视图中处理视图持有者时最好的方法感到困惑。

通常,我们这样创建视图:

    @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 用于视图创建和膨胀,而仅用于“业务逻辑”的东西
  • 同意@DavidMedenjak。我更喜欢注入活动/片段然后从那里手动构建对象图的方法。 (即在适配器的构造函数中传递内容,并从那里传递给 ViewHolders)。话虽如此,如果您确实想注入它,可能最简单的方法是在您的组件中创建 inject(ViewHolder) 方法,并使用带有 @Inject 注释的包私有字段。

标签: android dependency-injection dependencies code-injection dagger-2


【解决方案1】:

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 注入到您的活动中。然后你可以在你的适配器中注入一个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 进行测试,而不是针对重量级适配器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    • 2011-03-04
    • 2010-11-03
    • 2011-03-19
    • 2012-09-17
    相关资源
    最近更新 更多