我的结构是这样的,在Fragment
中,我将调用ViewModel
实例化Adapter
对于我的RecyclerView
的每个项目,我都有一个可以听的按钮
binding.addItem.setOnClickListener(onAddItemClicked(product))
private fun onAddToQuoteClicked(product: Product): View.OnClickListener {
return View.OnClickListener {
// TODO add item
}
}
我不知道如何将项目数据发送到片段,有没有办法做到这一点?
我应该在Adapter
和ViewModel
之间以及ViewModel
和Fragment
之间使用接口吗?
或者我可以使用RxEvent
和RxBus
吗?
答案 0 :(得分:0)
您可以通过ViewModel引用直接添加项目,并在Fragment或Activity中订阅RxJava EventBus或LiveData更改
答案 1 :(得分:0)
首先在ViewModel和Fragment之间导航-
第二个用于Adapter和Fragment之间的通信-您可以使用如上所述的相同策略。在那种情况下,我建议使用RxJava,因为通常情况下,您只需要处理一个或几个单击侦听器(例如,对于可观察对象,它会发出一些数据对象)。 如果您需要一些代码示例,请在注释中给我发短信。
更新-更好的做法是在View中创建适配器实例,因为我假设您正在使用MVVM设计模式(所有与UI相关的代码都必须位于View组件中)。
示例片段-适配器通信接收-PublishSubject
在您的适配器
private val publisher = PublishSubject.create<Product>()
fun getObservableProductItem(): Observable<Product> = publisher.hide()
binding.addItem.setOnClickListener(onAddItemClicked(product))
private fun onAddToQuoteClicked(product: Product): View.OnClickListener {
return View.OnClickListener {
publisherRideItem.onNext(items[adapterPosition])
}
}
override fun onDetachedFromRecyclerView(recyclerView: RecyclerView) {
publisherRideItem.onComplete()
}
在您的片段
中 compositeDisposable.add(adapter.getObservableProductItem().subscribe {
//TODO do whatever you want with it
})
override fun onDestroy() {
super.onDestroy()
compositeDisposable.clear()
}
答案 2 :(得分:-1)
RxJava PublishSubject是最好的选择,我更喜欢它,而且非常简单。
我尝试使用recyclerView-Fragment-ViewModel。有些将具有listadapter-> recyclerVire-> Fragment-> ViewModel。我已经在下面说明了。
列表适配器
在此处指定您的PublishSubject
class myapadter : ListAdapter
{
object RxBus {
val itemClickStream: PublishSubject<View> = PublishSubject.create()
}
}
ViewHolder
在您的viewHolder中触发该PublishSubject。
class myViewholder : RecyclerView.ViewHolder(itemView)
{
itemView.myButton.setOnClickListener {
v -> RxBus.itemClickStream.onNext(v) }
}
片段
在片段的此处订阅PublishSubject,这将自动得到通知。
myapadter.RxBus.itemClickStream.subscribe(){ v ->
if (v.id == R.id.myButton) {
viewModel.callyourfunction()
}