[我要做什么是将我的AccountType
类注入到ExpandableAdpter
,并在单击子视图时检查用户类型?
如何在适配器中实现匕首?
Dagger与Fragment和Activity配合正常。在适配器中仅获得空值,因为无法将适配器初始化为匕首
//Di interface
interface ActivityComponent : BaseComponent {
// adapter
fun inject(expDragSwipeAdapter: ExpandableDraggableSwipeableAdapter)
}
onCreate
@Inject lateinit var accountType: Accounts
private lateinit var activityComponent: ActivityComponent
override fun onCreateGroupViewHolder(parent: ViewGroup, viewType: Int): MyGroupViewHolder {
activityComponent.inject(this)
val inflater = LayoutInflater.from(parent.context)
val v: View
if (isDragRequire) {
v = inflater.inflate(R.layout.row_edit_watchlist, parent, false)
} else {
v = inflater.inflate(R.layout.row_watchlist, parent, false)
}
return MyGroupViewHolder(v, isDragRequire, mContext)
}
override fun onCreateChildViewHolder(parent: ViewGroup, viewType: Int): MyChildViewHolder {
activityComponent.inject(this)
val inflater = LayoutInflater.from(parent.context)
val v = inflater.inflate(R.layout.row_child_watchlist, parent, false)
return MyChildViewHolder(v, false)
}
我在此行activityComponent.inject(this)
中遇到错误
在onclick上检查AccountType并实现业务逻辑
不需要为RecyclerView或ListView从适配器内的Dagger 2组件请求注入。
对于片段和活动,我们别无选择,只能明确要求从Component进行注入,因为这些对象是由Android OS实例化的,并且我们不“控制”构造函数。
对于其他所有东西,包括适配器,您应该更喜欢构造函数注入,然后手动设置参数。
惯用语如下所示。在片段内部:
class MyFragment : Fragment {
@Inject
lateinit var accountsAdapter: accountsAdapter
@Inject
lateinit var accountsRepository: AccountsRepository
//load accounts in onStart or wherever you decide to load
//when loading finished, execute the following method in a callback
fun onAccountsLoaded(accounts: Accounts) {
adapter.setAccounts(accounts)
}
}
例如,您的适配器可以执行以下操作:
class Adapter @Inject constructor() : BaseAdapter {
fun setAccounts(accounts: Accounts) {
this.accounts = accounts
notifyDataSetChanged()
}
}
您可以看到有关在Dagger 2中使用ListView的官方Google Android建筑示例。链接为here