Сначала для навигации между 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()
}