如何为RecyclerView注入适配器?Dagger 2学习项目技术求助
解决Dagger 2无法注入RecyclerView适配器的问题
我完全懂你现在的困扰——Dagger把其他依赖都搞定了,偏偏RecyclerView的适配器注入卡壳,这种情况我之前踩过坑!咱们一步步来排查解决:
1. 核心问题:动态数据不能直接让Dagger注入
从你贴的代码片段来看,适配器的构造方法里应该是传入了List<Property>吧?Dagger的本质是注入固定/可提前提供的依赖实例,而网络请求返回的房产列表是动态变化的,Dagger没办法提前预知这个列表的内容,自然没法帮你注入它。
修正方案:拆分静态依赖与动态数据
把适配器的构造改成只注入静态依赖(比如Context、点击监听器这类不会随数据变化的对象),然后通过单独的方法设置动态列表:
public class PropertyListAdapter extends RecyclerView.Adapter<PropertyListAdapter.ViewHolder> { private List<Property> mPropertyList; private final Context mContext; // 静态依赖,由Dagger注入 @Inject public PropertyListAdapter(Context context) { mContext = context; mPropertyList = new ArrayList<>(); // 初始化空列表 } // 外部调用更新列表 public void updatePropertyList(List<Property> newList) { mPropertyList.clear(); mPropertyList.addAll(newList); notifyDataSetChanged(); } // ... 其余ViewHolder、onBindViewHolder等代码 }
然后在你的Activity/Fragment中:
@Inject PropertyListAdapter mPropertyAdapter; // Dagger注入适配器实例 // 网络请求成功后更新数据 mPropertyAdapter.updatePropertyList(networkResponse.getProperties()); mRecyclerView.setAdapter(mPropertyAdapter);
2. 确保Dagger能识别到你的适配器
- 如果适配器用了
@Inject构造方法,要保证你的Dagger组件(比如ActivityComponent)的作用域覆盖到了使用适配器的页面,并且组件能扫描到这个类(比如不要把适配器放在Dagger扫描不到的包下)。 - 如果适配器需要特殊依赖,也可以通过
@Module提供实例:
@Module public class AdapterModule { @Provides @ActivityScoped PropertyListAdapter providePropertyListAdapter(Context context) { return new PropertyListAdapter(context); } }
记得把这个模块添加到对应的Component中:
@ActivityScoped @Component(modules = AdapterModule.class, dependencies = AppComponent.class) public interface ActivityComponent { void inject(MainActivity activity); }
3. 检查作用域是否匹配
如果你的适配器用了自定义作用域(比如@ActivityScoped),那注入它的组件和页面必须属于同一个作用域,否则Dagger会抛出作用域不匹配的错误。适配器一般不需要单例,用和页面一致的作用域就好。
4. 清理缓存重建项目
有时候Dagger的注解处理器生成的代码会有缓存问题,导致注入失败。试试:
- 执行
Build > Clean Project+Build > Rebuild Project - 或者
File > Invalidate Caches... > Invalidate and Restart
内容的提问来源于stack exchange,提问作者Andritchi Alexei
相关产品推荐
相关产品推荐

