1

私のプロジェクトでdagger2を使って依存関係注入をカレンダーで実装していて、私は何かを見つけました。私は、recyclerviewのビューアを扱うときには最高のものを混乱させました。DIを実装するときにビューアを注入する必要がありますか?

通常、我々はこのような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を注入する方法、ありますか? 私はそれを注入すべきですか、それとも私はそれを残すべきですか?

+1

これは本当に単なる意見です。私は個人的にビューの作成とインフレにはダガーを使用しませんが、ビジネスロジックのものについては –

+0

@DavidMedenjakと同意します。私は、アクティビティ/フラグメントを注入してそこから手動でオブジェクトグラフを構築する方法を好む。 (つまり、アダプターのコンストラクターとViewHoldersの内容を渡します)。あなたがそれを挿入したいなら、おそらく最も簡単な方法はコンポーネントに '注入(ViewHolder)'メソッドを作成し、 '@ Inject'アノテーションを持つパッケージプライベートフィールドを持つことでしょう。 – theFunkyEngineer

答えて

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); 
} 

ここダガー2を使用してもポイントがないので、あなたはモックのため、実際の依存関係に交換することによりViewHolderをテストされることはありません。あなたはこのようなものに終わるだろうどこでデータバインディングを使用して検討することもでき、読みやすさを向上したい場合

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に対してではなく、ヘビー級アダプタに対してテストすることも可能であろう。

関連する問題