Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在实现DI时是否应该注入视图持有者?_Android_Dependency Injection_Dependencies_Code Injection_Dagger 2 - Fatal编程技术网

Android 在实现DI时是否应该注入视图持有者?

Android 在实现DI时是否应该注入视图持有者?,android,dependency-injection,dependencies,code-injection,dagger-2,Android,Dependency Injection,Dependencies,Code Injection,Dagger 2,我现在在我的项目中使用dagger2实现依赖注入,我偶然发现了一些东西,我不知道在recyclerview中处理视图持有者的最佳方法是什么 通常,我们会创建如下视图持有者: @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int pos) { View view = LayoutInflater.from(parent.getContext()) .i

我现在在我的项目中使用dagger2实现依赖注入,我偶然发现了一些东西,我不知道在recyclerview中处理视图持有者的最佳方法是什么

通常,我们会创建如下视图持有者:

    @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);
    }
return new ViewHolder(ListItemBinding.inflate(LayoutInflater.from(parent.getContext())));
现在我的问题是,如何注入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);
}
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);
}
换句话说,您不会通过将真实依赖项替换为模拟来测试ViewHolder,因此在这里使用Dagger 2没有任何意义

如果你想增加可读性,你可以考虑使用数据绑定,你会得到这样的结果:

    @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);
    }
return new ViewHolder(ListItemBinding.inflate(LayoutInflater.from(parent.getContext())));
或者,如果您有一个非常复杂的逻辑来生成ViewHolder,您可以将RecyclerView.Adapter注入到您的活动中。然后,可以在适配器中插入ViewHolderFactory,并使用它创建视图:

@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);
}
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而不是重量级适配器进行测试。

这实际上只是一个意见问题。我个人不会用Dagger来创建视图和膨胀,而只会用它来处理“业务逻辑”的东西。我更喜欢注入活动/片段,然后从那里手动构建对象图的方法。i、 e.将内容传递给适配器的构造函数,并从那里传递给视图持有者。话虽如此,如果您确实想要注入它,最简单的方法可能是在组件中创建并注入ViewHolder方法,并使用@inject注释包私有字段。