Skip to content

Commit e73f650

Browse files
committed
Done horizontal
1 parent 308733b commit e73f650

File tree

5 files changed

+53
-13
lines changed

5 files changed

+53
-13
lines changed

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

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import com.hoc.pagination_mvi.ui.main.MainContract.Item.HorizontalList.Horizonta
1414
import com.hoc.pagination_mvi.ui.main.MainContract.PlaceholderState
1515
import com.hoc.pagination_mvi.ui.main.MainContract.PostVS
1616
import com.jakewharton.rxbinding3.view.clicks
17-
import com.jakewharton.rxbinding3.view.detaches
1817
import io.reactivex.disposables.CompositeDisposable
1918
import io.reactivex.rxkotlin.addTo
2019
import io.reactivex.rxkotlin.subscribeBy
@@ -48,14 +47,14 @@ class HorizontalAdapter(
4847
) :
4948
ListAdapter<HorizontalItem, HorizontalAdapter.VH>(HorizontalItemItemCallback) {
5049

51-
private val retryS = PublishSubject.create<Unit>()
52-
val retryObservable get() = retryS.asObservable()
50+
private val retryNextPageS = PublishSubject.create<Unit>()
51+
val retryNextPageObservable get() = retryNextPageS.asObservable()
5352

5453
override fun onCreateViewHolder(parent: ViewGroup, @LayoutRes viewType: Int): VH {
5554
val itemView = LayoutInflater.from(parent.context).inflate(viewType, parent, false)
5655
return when (viewType) {
5756
R.layout.recycler_item_horizontal_post -> PostVH(itemView)
58-
R.layout.recycler_item_horizontal_placeholder -> PlaceholderVH(itemView, parent)
57+
R.layout.recycler_item_horizontal_placeholder -> PlaceholderVH(itemView)
5958
else -> error("Unknown viewType=$viewType")
6059
}
6160
}
@@ -94,15 +93,14 @@ class HorizontalAdapter(
9493
}
9594
}
9695

97-
private inner class PlaceholderVH(itemView: View, parent: ViewGroup) : VH(itemView) {
96+
private inner class PlaceholderVH(itemView: View) : VH(itemView) {
9897
private val progressBar = itemView.progress_bar!!
9998
private val textError = itemView.text_error!!
10099
private val buttonRetry = itemView.button_retry!!
101100

102101
init {
103102
buttonRetry
104103
.clicks()
105-
.takeUntil(parent.detaches())
106104
.filter {
107105
val position = adapterPosition
108106
if (position == RecyclerView.NO_POSITION) {
@@ -111,7 +109,7 @@ class HorizontalAdapter(
111109
(getItem(position) as? HorizontalItem.Placeholder)?.state is PlaceholderState.Error
112110
}
113111
}
114-
.subscribeBy { retryS.onNext(Unit) }
112+
.subscribeBy { retryNextPageS.onNext(Unit) }
115113
.addTo(compositeDisposable)
116114
}
117115

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

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@ class MainAdapter(private val compositeDisposable: CompositeDisposable) :
5858
private val loadNextPageHorizontalS = PublishSubject.create<Unit>()
5959
val loadNextPageHorizontalObservable get() = loadNextPageHorizontalS.asObservable()
6060

61+
private val retryNextPageHorizontalS = PublishSubject.create<Unit>()
62+
val retryNextPageHorizontalObservable get() = retryNextPageHorizontalS.asObservable()
63+
6164
private val retryHorizontalS = PublishSubject.create<Unit>()
6265
val retryHorizontalObservable get() = retryHorizontalS.asObservable()
6366

@@ -186,8 +189,22 @@ class MainAdapter(private val compositeDisposable: CompositeDisposable) :
186189
}
187190

188191
adapter
189-
.retryObservable
190-
.subscribe(retryHorizontalS::onNext)
192+
.retryNextPageObservable
193+
.subscribe(retryNextPageHorizontalS::onNext)
194+
.addTo(compositeDisposable)
195+
196+
buttonRetry
197+
.clicks()
198+
.takeUntil(parent.detaches())
199+
.filter {
200+
val position = adapterPosition
201+
if (position == RecyclerView.NO_POSITION) {
202+
false
203+
} else {
204+
(getItem(position) as? Item.HorizontalList)?.shouldRetry() == true
205+
}
206+
}
207+
.subscribeBy { retryHorizontalS.onNext(Unit) }
191208
.addTo(compositeDisposable)
192209

193210
recycler

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

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ interface MainContract {
4040
return horizontalList.postItems.size
4141
}
4242

43-
fun shouldRetryHorizontal(): Boolean {
43+
fun shouldRetryNextPageHorizontal(): Boolean {
4444
val horizontalList =
4545
items.singleOrNull { it is Item.HorizontalList } as? Item.HorizontalList ?: return false
4646
return !horizontalList.isLoading &&
@@ -50,6 +50,12 @@ interface MainContract {
5050
?.state is PlaceholderState.Error
5151
}
5252

53+
fun shouldRetryHorizontal(): Boolean {
54+
val horizontalList =
55+
items.singleOrNull { it is Item.HorizontalList } as? Item.HorizontalList ?: return false
56+
return horizontalList.shouldRetry()
57+
}
58+
5359
companion object Factory {
5460
@JvmStatic
5561
fun initial() = ViewState(
@@ -75,6 +81,10 @@ interface MainContract {
7581
val postItems: List<HorizontalItem.Post>
7682
) : Item(R.layout.recycler_item_horizontal_list) {
7783

84+
fun shouldRetry(): Boolean {
85+
return !isLoading && error !== null && items.isEmpty()
86+
}
87+
7888
sealed class HorizontalItem(@LayoutRes val viewType: Int) {
7989
data class Post(val post: PostVS) : HorizontalItem(R.layout.recycler_item_horizontal_post)
8090

@@ -144,6 +154,8 @@ interface MainContract {
144154
object LoadNextPageHorizontal : ViewIntent()
145155

146156
object RetryLoadPageHorizontal : ViewIntent()
157+
158+
object RetryHorizontal : ViewIntent()
147159
}
148160

149161
sealed class PartialStateChange {

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,10 +144,14 @@ class MainFragment : Fragment() {
144144
adapter
145145
.loadNextPageHorizontalObservable
146146
.map { ViewIntent.LoadNextPageHorizontal },
147+
adapter
148+
.retryNextPageHorizontalObservable
149+
.throttleFirst(500, TimeUnit.MILLISECONDS)
150+
.map { ViewIntent.RetryLoadPageHorizontal },
147151
adapter
148152
.retryHorizontalObservable
149153
.throttleFirst(500, TimeUnit.MILLISECONDS)
150-
.map { ViewIntent.RetryLoadPageHorizontal }
154+
.map { ViewIntent.RetryHorizontal }
151155
)
152156
).addTo(compositeDisposable)
153157
}

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

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,11 +85,19 @@ class MainVM @Inject constructor(
8585
ObservableTransformer<ViewIntent.RetryLoadPageHorizontal, PartialStateChange> { intents ->
8686
intents
8787
.withLatestFrom(stateObservable)
88-
.filter { (_, vs) -> vs.shouldRetryHorizontal() }
88+
.filter { (_, vs) -> vs.shouldRetryNextPageHorizontal() }
8989
.map { (_, vs) -> vs.getHorizontalListCount() }
9090
.exhaustMap { interactor.postNextPageChanges(start = it, limit = POST_PAGE_SIZE) }
9191
}
9292

93+
private val retryHorizontalProcessor =
94+
ObservableTransformer<ViewIntent.RetryHorizontal, PartialStateChange> { intents ->
95+
intents
96+
.withLatestFrom(stateObservable)
97+
.filter { (_, vs) -> vs.shouldRetryHorizontal() }
98+
.exhaustMap { interactor.postFirstPageChanges(limit = POST_PAGE_SIZE) }
99+
}
100+
93101
private val toPartialStateChange =
94102
ObservableTransformer<ViewIntent, PartialStateChange> { intents ->
95103
intents
@@ -103,7 +111,8 @@ class MainVM @Inject constructor(
103111
),
104112
shared.ofType<ViewIntent.RetryLoadPageHorizontal>().compose(
105113
retryLoadPageHorizontalProcessor
106-
)
114+
),
115+
shared.ofType<ViewIntent.RetryHorizontal>().compose(retryHorizontalProcessor)
107116
)
108117
}
109118
.compose(sendSingleEvent)

0 commit comments

Comments
 (0)