【发布时间】:2019-02-26 23:36:53
【问题描述】:
我又开始用 android 编程了,因为在过去的 4 年里它发生了很大的变化,我有点困惑。我正在尝试使用 ViewHolder 中的 RxJava 和 Flowable 从服务器异步加载我的数据。我正在使用第三方库来处理适配器MultiViewAdaptor 中的视图。这是我的 Binder
中的代码class FooBinder : ItemBinder<Foo, FooBinder.ViewHolder>() {
@Inject
protected lateinit var requestFavoriteUseCase: SendFooFavoriteUseCase
@Inject
protected lateinit var compositeDisposable: CompositeDisposable
@Inject
protected lateinit var retrieveFooFavoriteCountUseCase: RetrieveFooFavoriteCountUseCase
override fun create(inflater: LayoutInflater, parent: ViewGroup) =
ViewHolder(inflater.inflate(R.layout.item_foo_content, parent, false))
override fun bind(holder: ViewHolder, item: Foo) {
holder.itemView.foo_content_creator.text = with(item.creator) { "$firstName $lastName" }
GlideApp.with(holder.itemView)
.load(item.creator.avatar)
.dontAnimate()
.placeholder(R.drawable.ic_action_person)
.error(R.drawable.ic_action_person)
.into(holder.itemView.foo_content_profile)
retrieveFooFavoriteCountUseCase
.execute(item.id)
.applyComputationScheduler()
.subscribe { count ->
holder.itemView.foo_content_like_count.text = "$count"
}
.addTo(compositeDisposable)
}
inner class ViewHolder(view: View) : ViewHolder<Foo>(view) {
private var favorite = false
init {
view
.foo_content_button_layout
.clicks()
.flatMap {
favorite = !favorite
requestFavoriteUseCase.execute(FavoriteVM(item.id, favorite)).toObservable()
}
.subscribe {
view.foo_content_like_count.text = it.toString()
var res = R.drawable.ic_action_like_default
if (favorite) {
res = R.drawable.ic_action_like_enabled
}
view.foo_content_like_icon.setImageResource(res)
}
.addTo(compositeDisposable)
}
}
}
如您所见,我必须在 bind 方法中调用服务器,这并不理想,并且每次用户滚动时都会调用它,我也无法取消订阅它们,直到 Activity 被销毁并且 compositeDisposable 被调用,这意味着我将为一个视图提供多个一次性 :(
我的问题是,如何在 ViewHolder 中使用 observable 并在屏幕上未显示时停止喂它?
【问题讨论】:
标签: android kotlin android-recyclerview rx-java rx-java2