Как отправить данные из адаптера в ViewModel во фрагмент - PullRequest
1 голос
/ 28 мая 2019

Моя структура такая, в 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?

Ответы [ 2 ]

0 голосов
/ 28 мая 2019

Сначала для навигации между ViewModel и Fragment -

  • вы можете использовать RxJava PublishSubject сделать его публичным и подписаться на него во фрагменте, который может использовать публичные методы ViewModel.
  • или вы можете использовать интерфейс, на мой взгляд, лучше, поскольку, используя интерфейс, вы используете более простую логику, в этом случае гораздо меньше ошибок, а также более чистый код, поскольку вы можете называть методы в интерфейсе по своему усмотрению -легче читать.

Второй для связи между адаптером и фрагментом - вы можете использовать ту же стратегию, как описано выше.В этом случае я рекомендую использовать RxJava, так как обычно вам просто нужно обработать один или несколько прослушивателей щелчков (так, например, для наблюдаемого, который генерирует некоторый объект данных).
Если вам нужен текст примеров кодаменя в комментариях .

ОБНОВЛЕНИЕ - лучше создать экземпляр адаптера в представлении, так как я предполагаю, что вы используете шаблон проектирования MVVM (где должен быть весь код, связанный с пользовательским интерфейсом)находится в компоненте View).

Пример фрагмента - Связь с адаптером Rx - 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()
}
0 голосов
/ 28 мая 2019

Вы можете напрямую добавить элемент через ссылку ViewModel и подписаться на изменение RxJava EventBus или LiveData в своем фрагменте или операции

...