java - 不知道如何为 RecyclerView 注入适配器
问题描述
我做了一个简单的项目来学习 Dagger。该应用程序正在从 Internet 获取属性列表(度假租赁)并将其显示在RecyclerView
列表中。我用 Dagger 2 注入了所有依赖项,除了列表的适配器。适配器非常标准,它需要一个属性列表并填充视图:
public class PropertyListAdapter extends RecyclerView.Adapter<PropertyListAdapter.ViewHolder> {
private List<Property> mPropertyList;
@Inject
public PropertyListAdapter(List<Property> propertyList) {
mPropertyList = propertyList;
}
// onCreateViewHolder()
// onBindViewHolder()
// getItemCount()
// class ViewHolder{}
}
该应用程序由一个活动组成,该活动包含一个包含recyclerview
列表的片段。在片段中,onActivityCreated()
我有:
mPropertyViewModel.getPropertyList().observe(this, properties -> setPropertyAdapter(properties));
是setPropertyAdapter()
:
private void setPropertyAdapter(List<Property> properties) {
rvPropertyList.setAdapter(new PropertyListAdapter(properties));
}
因此,为了注入,PropertyListAdapter
我创建了一个模块:
@Module
public class AdapterModule {
@Provides
@Singleton
PropertyListAdapter providePropertyListAdapter(List<Property> propertyList) {
return new PropertyListAdapter(propertyList);
}
}
但后来我意识到我必须注入List<Property>
,我不知道如何实现这一点,我被卡住了。在这个例子中如何注入适配器?
PS 我正在使用带有架构组件的 MVVM。
日志猫:error: [dagger.android.AndroidInjector.inject(T)] java.util.List<com.aandritchi.android.propertyrentals.data.domain.Property> cannot be provided without an @Provides-annotated method.
java.util.List<com.aandritchi.android.propertyrentals.data.domain.Property> is injected at
com.aandritchi.android.propertyrentals.di.module.data.AdapterModule.providePropertyListAdapter(propertyList)
com.aandritchi.android.propertyrentals.ui.search_result.PropertyListAdapter is injected at
com.aandritchi.android.propertyrentals.ui.search_result.PropertySearchResultFragment.mPropertyListAdapter
com.aandritchi.android.propertyrentals.ui.search_result.PropertySearchResultFragment is injected at
com.aandritchi.android.propertyrentals.ui.home.HomeActivity.mPropertySearchResultFragment
com.aandritchi.android.propertyrentals.ui.home.HomeActivity is injected at
dagger.android.AndroidInjector.inject(arg0)
解决方案
你应该问自己:我真的需要注入适配器吗?
您想要这样做的两个原因:
1)适配器具有您要注入的依赖项。这不是你的情况,因为除了属性列表之外没有任何其他依赖项。
2)您想从您的活动/片段中删除创建适配器实例的责任。
这两个问题的正确解决方案是注入一个工厂,该工厂已经注入了所有可注入的依赖项,并提供了一种创建实例的方法。
推荐阅读
- c# - 表格单元格中的动态跨度标记未加载视图中的文本
- python - lambda 函数如何获得它的价值?
- ms-access - 标识符内的参数
- amazon-web-services - 计划任务产生太多任务
- python - 提取大于指定大小的连续值组
- scala - 匿名函数中的下划线是什么意思?
- javascript - Magento 2 模态 z-index
- sensors - PRU 不会为 hcsr-04 超声波传感器(Beaglebone black)初始化
- php - PHP 7.2 xml domdocument获取属性等于的兄弟的给定子节点值的节点值
- php - 具有多个查询的正则表达式