Skip to content

Commit 1abef74

Browse files
committed
up
1 parent 1817274 commit 1abef74

File tree

4 files changed

+37
-3
lines changed

4 files changed

+37
-3
lines changed

app/src/main/java/com/hoc/pagination_mvi/ui/main/MainAdapter.kt

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.hoc.pagination_mvi.ui.main
22

3+
import android.graphics.Rect
34
import android.util.Log
45
import android.view.LayoutInflater
56
import android.view.View
@@ -15,6 +16,7 @@ import com.hoc.pagination_mvi.R
1516
import com.hoc.pagination_mvi.asObservable
1617
import com.hoc.pagination_mvi.ui.main.MainContract.Item
1718
import com.hoc.pagination_mvi.ui.main.MainContract.PlaceholderState
19+
import com.jakewharton.rxbinding3.recyclerview.scrollEvents
1820
import com.jakewharton.rxbinding3.view.clicks
1921
import com.jakewharton.rxbinding3.view.detaches
2022
import 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) {

app/src/main/java/com/hoc/pagination_mvi/ui/main/MainContract.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,9 @@ interface MainContract {
109109
object Initial : ViewIntent()
110110
object LoadNextPage : ViewIntent()
111111
object RetryLoadPage : ViewIntent()
112+
113+
object LoadNextPageHorizontal: ViewIntent()
114+
object RetryLoadPageHorizontal: ViewIntent()
112115
}
113116

114117
sealed class PartialStateChange {

app/src/main/java/com/hoc/pagination_mvi/ui/main/MainFragment.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,10 @@ class MainFragment : Fragment() {
124124
adapter
125125
.retryObservable
126126
.throttleFirst(500, TimeUnit.MILLISECONDS)
127-
.map { ViewIntent.RetryLoadPage }
127+
.map { ViewIntent.RetryLoadPage },
128+
adapter
129+
.loadNextPageHorizontalObservable
130+
.map { ViewIntent.LoadNextPageHorizontal }
128131
)
129132
).addTo(compositeDisposable)
130133
}

app/src/main/res/layout/recycler_item_horizontal_list.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
xmlns:app="http://schemas.android.com/apk/res-auto"
44
xmlns:tools="http://schemas.android.com/tools"
55
android:layout_width="match_parent"
6+
android:background="#fafafa"
67
android:layout_height="200dp">
78

89
<androidx.recyclerview.widget.RecyclerView

0 commit comments

Comments
 (0)