11package com.hoc.pagination_mvi.ui.main
22
3+ import android.graphics.Rect
34import android.util.Log
45import android.view.LayoutInflater
56import android.view.View
@@ -15,6 +16,7 @@ import com.hoc.pagination_mvi.R
1516import com.hoc.pagination_mvi.asObservable
1617import com.hoc.pagination_mvi.ui.main.MainContract.Item
1718import com.hoc.pagination_mvi.ui.main.MainContract.PlaceholderState
19+ import com.jakewharton.rxbinding3.recyclerview.scrollEvents
1820import com.jakewharton.rxbinding3.view.clicks
1921import com.jakewharton.rxbinding3.view.detaches
2022import io.reactivex.disposables.CompositeDisposable
@@ -53,12 +55,15 @@ class MainAdapter(private val compositeDisposable: CompositeDisposable) :
5355 private val retryS = PublishSubject .create<Unit >()
5456 val retryObservable get() = retryS.asObservable()
5557
58+ private val loadNextPageHorizontalS = PublishSubject .create<Unit >()
59+ val loadNextPageHorizontalObservable get() = loadNextPageHorizontalS.asObservable()
60+
5661 override fun onCreateViewHolder (parent : ViewGroup , @LayoutRes viewType : Int ): VH {
5762 val itemView = LayoutInflater .from(parent.context).inflate(viewType, parent, false )
5863 return when (viewType) {
5964 R .layout.recycler_item_photo -> PhotoVH (itemView)
6065 R .layout.recycler_item_placeholder -> PlaceHolderVH (itemView, parent)
61- R .layout.recycler_item_horizontal_list -> HorizontalListVH (itemView)
66+ R .layout.recycler_item_horizontal_list -> HorizontalListVH (itemView, parent )
6267 else -> error(" Unknown viewType=$viewType " )
6368 }
6469 }
@@ -151,19 +156,41 @@ class MainAdapter(private val compositeDisposable: CompositeDisposable) :
151156 }
152157 }
153158
154- private class HorizontalListVH (itemView : View ) : VH(itemView) {
159+ private inner class HorizontalListVH (itemView : View , parent : ViewGroup ) : VH(itemView) {
155160 private val recycler = itemView.recycler_horizontal!!
156161 private val progressBar = itemView.progress_bar_horizontal!!
157162 private val textError = itemView.text_error_horizontal!!
158163 private val buttonRetry = itemView.button_retry_horizontal!!
159164 private val adapter = HorizontalAdapter ()
165+ private val visibleThreshold get() = 2
160166
161167 init {
162168 recycler.run {
163169 setHasFixedSize(true )
164170 adapter = this @HorizontalListVH.adapter
165171 layoutManager = LinearLayoutManager (context, RecyclerView .HORIZONTAL , false )
172+ addItemDecoration(object : RecyclerView .ItemDecoration () {
173+ override fun getItemOffsets (
174+ outRect : Rect ,
175+ view : View ,
176+ parent : RecyclerView ,
177+ state : RecyclerView .State
178+ ) {
179+ outRect.left =
180+ if (parent.getChildAdapterPosition(view) == parent.adapter!! .itemCount - 1 ) 0 else 8
181+ }
182+ })
166183 }
184+
185+ recycler
186+ .scrollEvents()
187+ .takeUntil(parent.detaches())
188+ .filter { (_, dx, _) ->
189+ val layoutManager = recycler.layoutManager as LinearLayoutManager
190+ dx > 0 && layoutManager.findLastVisibleItemPosition() + visibleThreshold >= layoutManager.itemCount
191+ }
192+ .subscribeBy { loadNextPageHorizontalS.onNext(Unit ) }
193+ .addTo(compositeDisposable)
167194 }
168195
169196 override fun bind (item : Item ) {
0 commit comments