RxJava 导致水平 RecyclerView 滚动不当行为

RxJava causing Horizontal RecyclerView Scrolling Misbehavior

我正在尝试使用 RxJava 在本地 更新 一个对象,这样我就可以在一些用户输入后将它发送回服务器。我试图在垂直 RecyclerView 中使用 Horizo​​ntal 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>