如何将数据从适配器发送到ViewModel到Fragment

时间:2019-05-28 06:55:43

标签: android android-fragments kotlin adapter

我的结构是这样的,在Fragment中,我将调用ViewModel实例化Adapter

对于我的RecyclerView的每个项目,我都有一个可以听的按钮

binding.addItem.setOnClickListener(onAddItemClicked(product))

private fun onAddToQuoteClicked(product: Product): View.OnClickListener {
    return View.OnClickListener {
        // TODO add item
    }
}

我不知道如何将项目数据发送到片段,有没有办法做到这一点?

我应该在AdapterViewModel之间以及ViewModelFragment之间使用接口吗?

或者我可以使用RxEventRxBus吗?

3 个答案:

答案 0 :(得分:0)

您可以通过ViewModel引用直接添加项目,并在Fragment或Activity中订阅RxJava EventBus或LiveData更改

答案 1 :(得分:0)

首先在ViewModel和Fragment之间导航-

  • 您可以使用RxJava PublishSubject 将其公开,并在可以使用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()
            }