RxJava 导致水平 RecyclerView 滚动不当行为
RxJava causing Horizontal RecyclerView Scrolling Misbehavior
我正在尝试使用 RxJava 在本地 更新 一个对象,这样我就可以在一些用户输入后将它发送回服务器。我试图在垂直 RecyclerView 中使用 Horizontal RecyclerView,但试图使用 RxJava 与 Room DB 异步通信导致滚动错误行为。
如果您有任何反馈或需要任何其他代码,请告诉我。
没有 RxJava
ViewHolder
inner class ScoreViewHolder(view: View) : RecyclerView.ViewHolder(view){
private val mNumberPickerLocal = view.findViewById(R.id.number_picker_local) as ScrollableNumberPicker
private val mNumberPickerAway = view.findViewById(R.id.number_picker_away) as ScrollableNumberPicker
fun bind(scoreboard: Scoreboard, position: Int){
val home = scoreboard.home
val away = scoreboard.away
mNumberPickerLocal.value = home.toInt()
mNumberPickerAway.value = away.toInt()
mNumberPickerLocal.setListener { value ->
println(value)
}
mNumberPickerAway.setListener { value ->
println(value)
}
}
}
使用 RxJava
ViewHolder
inner class ScoreViewHolder(view: View) : RecyclerView.ViewHolder(view){
private val mNumberPickerLocal = view.findViewById(R.id.number_picker_local) as ScrollableNumberPicker
private val mNumberPickerAway = view.findViewById(R.id.number_picker_away) as ScrollableNumberPicker
fun bind(scoreboard: Scoreboard, position: Int){
val home = scoreboard.home
val away = scoreboard.away
mNumberPickerLocal.value = home.toInt()
mNumberPickerAway.value = away.toInt()
mNumberPickerLocal.setListener { value ->
mDisposable.add(userMatchesVM.updateHomeScore(value.toLong(), scoreboard.id)
.subscribeOn(Schedulers.io())
.doOnComplete { println("LOCAL SCORE = $value") }
.subscribe())
// Gettting Flowable<Object>
mDisposable.add(userMatchesVM.getUsermatchByID(scoreboard.id)
.subscribeOn(Schedulers.io())
.doOnNext {
FirestoreBackend.updateFirebaseMatch(it, "SCORE VH")
}
.subscribe())
}
mNumberPickerAway.setListener { value ->
mDisposable.add(userMatchesVM.updateAwayScore(value.toLong(), scoreboard.id)
.subscribeOn(Schedulers.io())
.doOnComplete { println("AWAY SCORE = $value") }
.subscribe())
// Gettting Flowable<Object>
mDisposable.add(userMatchesVM.getUsermatchByID(scoreboard.id)
.subscribeOn(Schedulers.io())
.doOnNext {
FirestoreBackend.updateFirebaseMatch(it, "WINNER VH")
}
.subscribe())
}
}
}
UsermatchesViewModel.kt
fun updateHomeScore(home: Long, id: String): Completable =
Completable.fromAction { mFantasyDB.usermatchesDAO().updateHomeScore(home, id) }
fun updateAwayScore(away: Long, id: String): Completable =
Completable.fromAction { mFantasyDB.usermatchesDAO().updateAwayScore(away, id) }
fun getUsermatchByID(id: String): Flowable<Usermatches> =
mFantasyDB.usermatchesDAO().getUsermatch(id)
UsermatchesDAO
@Query("update usermatches set home_score = :home where usermatches_id = :id")
fun updateHomeScore(home: Long, id: String)
@Query("update usermatches set away_score = :away where usermatches_id = :id")
fun updateAwayScore(away: Long, id: String)
@Query("select * from usermatches where usermatches_id = :id limit 1")
fun getUsermatch(id: String): Flowable<Usermatches>
这个问题的解决方案在于你如何实现你的 Observable 类型,我的意思是:我正在使用一个 Flowable<Object>
到 1 个对象,这是每次注册用户输入时都会刷新它。为了解决这个问题,我将 ViewModel 和 DAO 的 更改为 Single.
ViewModel
fun getMatchesByID(id: String): Single<Matches> =
mFantasyDB.matchesDAO().getMatchesByID(id)
DAO
@Query("select * from matches where match_id = :id")
fun getMatchesByID(id: String): Single<Matches>
我正在尝试使用 RxJava 在本地 更新 一个对象,这样我就可以在一些用户输入后将它发送回服务器。我试图在垂直 RecyclerView 中使用 Horizontal RecyclerView,但试图使用 RxJava 与 Room DB 异步通信导致滚动错误行为。 如果您有任何反馈或需要任何其他代码,请告诉我。
没有 RxJava
ViewHolder
inner class ScoreViewHolder(view: View) : RecyclerView.ViewHolder(view){
private val mNumberPickerLocal = view.findViewById(R.id.number_picker_local) as ScrollableNumberPicker
private val mNumberPickerAway = view.findViewById(R.id.number_picker_away) as ScrollableNumberPicker
fun bind(scoreboard: Scoreboard, position: Int){
val home = scoreboard.home
val away = scoreboard.away
mNumberPickerLocal.value = home.toInt()
mNumberPickerAway.value = away.toInt()
mNumberPickerLocal.setListener { value ->
println(value)
}
mNumberPickerAway.setListener { value ->
println(value)
}
}
}
使用 RxJava
ViewHolder
inner class ScoreViewHolder(view: View) : RecyclerView.ViewHolder(view){
private val mNumberPickerLocal = view.findViewById(R.id.number_picker_local) as ScrollableNumberPicker
private val mNumberPickerAway = view.findViewById(R.id.number_picker_away) as ScrollableNumberPicker
fun bind(scoreboard: Scoreboard, position: Int){
val home = scoreboard.home
val away = scoreboard.away
mNumberPickerLocal.value = home.toInt()
mNumberPickerAway.value = away.toInt()
mNumberPickerLocal.setListener { value ->
mDisposable.add(userMatchesVM.updateHomeScore(value.toLong(), scoreboard.id)
.subscribeOn(Schedulers.io())
.doOnComplete { println("LOCAL SCORE = $value") }
.subscribe())
// Gettting Flowable<Object>
mDisposable.add(userMatchesVM.getUsermatchByID(scoreboard.id)
.subscribeOn(Schedulers.io())
.doOnNext {
FirestoreBackend.updateFirebaseMatch(it, "SCORE VH")
}
.subscribe())
}
mNumberPickerAway.setListener { value ->
mDisposable.add(userMatchesVM.updateAwayScore(value.toLong(), scoreboard.id)
.subscribeOn(Schedulers.io())
.doOnComplete { println("AWAY SCORE = $value") }
.subscribe())
// Gettting Flowable<Object>
mDisposable.add(userMatchesVM.getUsermatchByID(scoreboard.id)
.subscribeOn(Schedulers.io())
.doOnNext {
FirestoreBackend.updateFirebaseMatch(it, "WINNER VH")
}
.subscribe())
}
}
}
UsermatchesViewModel.kt
fun updateHomeScore(home: Long, id: String): Completable =
Completable.fromAction { mFantasyDB.usermatchesDAO().updateHomeScore(home, id) }
fun updateAwayScore(away: Long, id: String): Completable =
Completable.fromAction { mFantasyDB.usermatchesDAO().updateAwayScore(away, id) }
fun getUsermatchByID(id: String): Flowable<Usermatches> =
mFantasyDB.usermatchesDAO().getUsermatch(id)
UsermatchesDAO
@Query("update usermatches set home_score = :home where usermatches_id = :id")
fun updateHomeScore(home: Long, id: String)
@Query("update usermatches set away_score = :away where usermatches_id = :id")
fun updateAwayScore(away: Long, id: String)
@Query("select * from usermatches where usermatches_id = :id limit 1")
fun getUsermatch(id: String): Flowable<Usermatches>
这个问题的解决方案在于你如何实现你的 Observable 类型,我的意思是:我正在使用一个 Flowable<Object>
到 1 个对象,这是每次注册用户输入时都会刷新它。为了解决这个问题,我将 ViewModel 和 DAO 的 更改为 Single.
ViewModel
fun getMatchesByID(id: String): Single<Matches> =
mFantasyDB.matchesDAO().getMatchesByID(id)
DAO
@Query("select * from matches where match_id = :id")
fun getMatchesByID(id: String): Single<Matches>