我们经常有这样的需求:RecyclerView滑动到末尾时自动触发loadMore。传统的做法比较复杂,借助RxBinding可以非常简单地实现
准备
- rxjava2
- rxkotlin
- rxbinding-recyclerview-v7
- rxbinding-recyclerview-v7-kotlin
滑动监听
val layoutManager = LinearLayoutManager(...)
recyclerView
.scrollEvents()
.filter {
layoutManager.itemCount - 1 <= layoutManager.findLastVisibleItemPosition() }
.subscribe {
loadMore() }
如上,Scroll的监听变得非常简单。
数据加载
val loadCompletedStream = PublishSubject.create<Unit>()
recyclerView
.scrollEvents()
.skipUntil(loadCompletedStream)
.filter {
layoutManager.itemCount - 1 <= layoutManager.findLastVisibleItemPosition() }
.take(1)
.repeat()
.subscribe {
loadMore() }
loadCompletedStream
:数据加载完成的通知skipUntil()
: 收到loadCompletedStream之前不在下发scroll事件take(1)
:避免多次触发loadMorerepeat()
: 接收到onComplete时触发重订阅,监听下次loadMore
以上同样的逻辑,通常需要大量代码,使用RxJava只需要几个操作符,轻轻松松。