RxJava导致水平RecyclerView滚动不正常

时间:2018-07-17 20:04:21

标签: android android-recyclerview rx-java android-adapter

我正在尝试使用RxJava在本地更新一个对象,因此我可以在一些用户输入后将其发送回服务器。我试图在垂直的RecyclerView中使用水平的RecyclerView,但尝试使用 RxJava 与Room DB异步通信会导致滚动异常。 如果您有任何反馈意见或需要任何其他代码,请告诉我。

没有RxJava

WithoutRxJava

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

enter image description here

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>

1 个答案:

答案 0 :(得分:1)

此问题的解决方案在于您如何实现可观察的类型,这意味着:我正在使用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>