Android RxJava导致水平RecyclerView滚动错误行为

Android RxJava导致水平RecyclerView滚动错误行为,android,android-recyclerview,rx-java,android-adapter,Android,Android Recyclerview,Rx Java,Android Adapter,我试图使用RxJava在本地更新一个对象,以便在用户输入后将其发送回服务器。我试图在垂直循环视图中使用水平循环视图,但试图使用RxJava与房间数据库异步通信会导致滚动错误行为。 如果您有任何反馈或需要任何其他代码,请让我知道 不带RxJava ViewHolder inner class ScoreViewHolder(view: View) : RecyclerView.ViewHolder(view){ private val mNumberPickerLocal = view

我试图使用RxJava在本地更新一个对象,以便在用户输入后将其发送回服务器。我试图在垂直循环视图中使用水平循环视图,但试图使用RxJava与房间数据库异步通信会导致滚动错误行为。 如果您有任何反馈或需要任何其他代码,请让我知道

不带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)
        }
    }
}
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())
        }
    }
}
使用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)
        }
    }
}
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())
        }
    }
}
内部类ScoreViewHolder(视图:视图):RecyclerView.ViewHolder(视图){
private val mNumberPickerLocal=view.findViewById(R.id.number\u picker\u local)作为ScrollableNumberPicker
private val mNumberPickerAway=view.findViewById(R.id.number\u picker\u away)作为ScrollableNumberPicker
趣味绑定(记分板:记分板,位置:Int){
val home=记分牌.home
val away=记分牌
mNumberPickerLocal.value=home.toInt()
mNumberPickerAway.value=away.toInt()
mNumberPickerLocal.setListener{value->
添加(userMatchesVM.updateHomeScore(value.toLong(),scoreboard.id)
.subscribeOn(Schedulers.io())
.doOnComplete{println(“本地分数=$value”)}
.subscribe())
//吸气流动
mDisposable.add(userMatchesVM.getUsermatchByID(scoreboard.id)
.subscribeOn(Schedulers.io())
doOnNext先生{
FirestoreBackend.updateFirebaseMatch(它是“分数VH”)
}
.subscribe())
}
mNumberPickerAway.setListener{value->
mDisposable.add(userMatchesVM.updateAwayScore(value.toLong(),scoreboard.id)
.subscribeOn(Schedulers.io())
.doOnComplete{println(“客场得分=$value”)}
.subscribe())
//吸气流动
mDisposable.add(userMatchesVM.getUsermatchByID(scoreboard.id)
.subscribeOn(Schedulers.io())
doOnNext先生{
FirestoreBackend.updateFirebaseMatch(它是“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)
fun updateHomeScore(home:Long,id:String):可完成=
Completable.fromAction{mFantasyDB.usermatchesDAO().updateHomeScore(home,id)}
fun UpdateWayScore(客场:长,id:字符串):可完成=
Completable.fromAction{mFantasyDB.usermatchesDAO().updateAwayScore(离开,id)}
fun getUsermatchByID(id:String):可流动=
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>
@Query("select * from matches where match_id = :id")
fun getMatchesByID(id: String): Single<Matches>
@Query(“更新usermatches set home\u score=:home,其中usermatches\u id=:id”)
fun updateHomeScore(home:Long,id:String)
@查询(“更新usermatches set-away\u score=:away,其中usermatches\u id=:id”)
趣味UpdateWayScore(客场:长,id:字符串)
@查询(“从usermatches中选择*,其中usermatches\u id=:id limit 1”)
趣味getUsermatch(id:String):可流动

这个问题的解决方案在于如何实现可观察的类型,我的意思是:我使用了一个
可流动的
对象,每次注册用户输入时都会刷新它。为了解决这个问题,我将我的视图模型和DAO的更改为单个

视图模型

fun getMatchesByID(id: String): Single<Matches> =
        mFantasyDB.matchesDAO().getMatchesByID(id)
fun getMatchesByID(id:String):单个=
mFantasyDB.matchesDAO().getMatchesByID(id)
DAO

@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>
@Query("select * from matches where match_id = :id")
fun getMatchesByID(id: String): Single<Matches>
@Query(“从匹配项中选择*,其中匹配项为:id”)
趣味getMatchesByID(id:String):单个