1

在我的項目中,我正在使用dagger2 currenly實現依賴注入,我偶然發現了一些東西,我對在回收視圖中處理視圖時處理什麼是最好的應用感到困惑。實施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

這確實只是一個意見問題。我個人不會使用Dagger進行視圖創建和通貨膨脹,但只能用於'業務邏輯'的東西 –

+0

同意@DavidMedenjak。我更喜歡注入Activities/Fragments的方法,然後從那裏手動構建對象圖。 (即傳遞適配器構造函數中的東西,並從那裏傳遞給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而不是反對重量級適配器。