Skip to content

Commit 052e1e7

Browse files
committed
update loadmore
1 parent 4e4cd6f commit 052e1e7

File tree

6 files changed

+25
-99
lines changed

6 files changed

+25
-99
lines changed

app/src/main/java/com/example/moviedb/ui/base/loadmorerefresh/BaseLoadMoreRefreshViewModel.kt

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package com.example.moviedb.ui.base.loadmorerefresh
22

33
import com.example.moviedb.data.constant.Constants
44
import com.example.moviedb.ui.base.BaseViewModel
5-
import com.example.moviedb.ui.widgets.EndlessRecyclerOnScrollListener
65
import kotlinx.coroutines.flow.MutableStateFlow
76

87
/**
@@ -15,20 +14,14 @@ abstract class BaseLoadMoreRefreshViewModel<Item>() : BaseViewModel() {
1514

1615
// load more flag
1716
private val isLoadMore = MutableStateFlow(false)
17+
private var loadMoreTimeMillis = 0L
1818

1919
// current page
2020
private val currentPage = MutableStateFlow(getPreFirstPage())
2121

2222
// last page flag
2323
private val isLastPage = MutableStateFlow(false)
2424

25-
// scroll listener for recycler view
26-
val onScrollListener = object : EndlessRecyclerOnScrollListener(getLoadMoreThreshold()) {
27-
override fun onLoadMore() {
28-
doLoadMore()
29-
}
30-
}
31-
3225
// item list
3326
val itemList = MutableStateFlow(arrayListOf<Item>())
3427

@@ -70,20 +63,29 @@ abstract class BaseLoadMoreRefreshViewModel<Item>() : BaseViewModel() {
7063
/**
7164
* load first page
7265
*/
73-
protected fun refreshData() {
66+
private fun refreshData() {
7467
loadData(getFirstPage())
7568
}
7669

70+
fun onBind(position: Int) {
71+
// Timber.v("Check load more on $position")
72+
if (itemList.value.size - position < getLoadMoreThreshold()) {
73+
doLoadMore()
74+
}
75+
}
76+
7777
fun doLoadMore() {
7878
when {
7979
isLoading()
8080
|| isRefreshing.value
8181
|| isLoadMore.value
82-
|| isLastPage.value -> {
82+
|| isLastPage.value
83+
|| System.currentTimeMillis() - loadMoreTimeMillis < 2000 -> {
8384
}
8485

8586
else -> {
8687
isLoadMore.value = true
88+
loadMoreTimeMillis = System.currentTimeMillis()
8789
loadMore()
8890
}
8991
}
@@ -92,7 +94,7 @@ abstract class BaseLoadMoreRefreshViewModel<Item>() : BaseViewModel() {
9294
/**
9395
* load next page
9496
*/
95-
protected fun loadMore() {
97+
private fun loadMore() {
9698
loadData(currentPage.value.plus(1))
9799
}
98100

@@ -116,8 +118,7 @@ abstract class BaseLoadMoreRefreshViewModel<Item>() : BaseViewModel() {
116118
/**
117119
* reset load more
118120
*/
119-
fun resetLoadMore() {
120-
onScrollListener.resetOnLoadMore()
121+
private fun resetLoadMore() {
121122
isLastPage.value = false
122123
}
123124

@@ -144,26 +145,21 @@ abstract class BaseLoadMoreRefreshViewModel<Item>() : BaseViewModel() {
144145
isLastPage.value = (items?.size ?: 0) < getNumberItemPerPage()
145146

146147
// reset load
147-
// hideLoading()
148148
isRefreshing.value = false
149149
isLoadMore.value = false
150-
150+
showSuccess()
151151
// check empty list
152152
checkEmptyList()
153-
showSuccess()
154153
}
155154

156155
/**
157156
* handle load fail
158157
*/
159158
override suspend fun onError(throwable: Throwable) {
160159
super.onError(throwable)
161-
onScrollListener.isLoading = false
162-
163160
// reset load
164161
isRefreshing.value = false
165162
isLoadMore.value = false
166-
167163
// check empty list
168164
checkEmptyList()
169165
}

app/src/main/java/com/example/moviedb/ui/screen/popularmovie/PopularMovieAdapter.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,12 @@ import com.example.moviedb.R
55
import com.example.moviedb.data.model.Movie
66
import com.example.moviedb.databinding.ItemMovieBinding
77
import com.example.moviedb.ui.base.BaseListAdapter
8+
import com.example.moviedb.ui.base.BaseViewHolder
89
import com.example.moviedb.utils.setSingleClick
910

1011
class PopularMovieAdapter(
11-
val itemClickListener: (Movie) -> Unit = {}
12+
val itemClickListener: (Movie) -> Unit = {},
13+
val onBindPosition: (Int) -> Unit = {}
1214
) : BaseListAdapter<Movie, ItemMovieBinding>(object : DiffUtil.ItemCallback<Movie>() {
1315
override fun areItemsTheSame(oldItem: Movie, newItem: Movie): Boolean {
1416
return oldItem.id == newItem.id
@@ -33,4 +35,8 @@ class PopularMovieAdapter(
3335
}
3436
}
3537

38+
override fun onBindViewHolder(holder: BaseViewHolder<ItemMovieBinding>, position: Int) {
39+
super.onBindViewHolder(holder, position)
40+
onBindPosition(position)
41+
}
3642
}

app/src/main/java/com/example/moviedb/ui/screen/popularmovie/PopularMovieFragment.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ class PopularMovieFragment :
2222
override val viewModel: PopularMovieViewModel by viewModels()
2323
override val listAdapter: BaseListAdapter<Movie, out ViewDataBinding> by lazy {
2424
PopularMovieAdapter(
25-
itemClickListener = { toMovieDetail(it) }
25+
itemClickListener = { toMovieDetail(it) },
26+
onBindPosition = { viewModel.onBind(it) }
2627
)
2728
}
2829
override val swipeRefreshLayout: SwipeRefreshLayout

app/src/main/java/com/example/moviedb/ui/widgets/EndlessRecyclerOnScrollListener.kt

Lines changed: 0 additions & 70 deletions
This file was deleted.

app/src/main/java/com/example/moviedb/utils/BindingUtils.kt

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import android.widget.TextView
1010
import androidx.annotation.DrawableRes
1111
import androidx.core.widget.ContentLoadingProgressBar
1212
import androidx.databinding.BindingAdapter
13-
import androidx.recyclerview.widget.RecyclerView
1413
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
1514
import com.bumptech.glide.Glide
1615
import com.bumptech.glide.load.engine.DiskCacheStrategy
@@ -31,11 +30,6 @@ fun SwipeRefreshLayout.customRefreshing(refreshing: Boolean?) {
3130
isRefreshing = refreshing == true
3231
}
3332

34-
@BindingAdapter("onScrollListener")
35-
fun RecyclerView.customScrollListener(listener: RecyclerView.OnScrollListener?) {
36-
if (listener != null) addOnScrollListener(listener)
37-
}
38-
3933
@BindingAdapter("glideSrc")
4034
fun ImageView.setGlideSrc(@DrawableRes src: Int?) {
4135
Glide.with(context).load(src).into(this)

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,7 @@
3030
<androidx.recyclerview.widget.RecyclerView
3131
android:id="@+id/recycler_view"
3232
android:layout_width="match_parent"
33-
android:layout_height="match_parent"
34-
app:onScrollListener="@{ viewModel.onScrollListener }" />
33+
android:layout_height="match_parent" />
3534

3635
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
3736

0 commit comments

Comments
 (0)