Skip to content

Commit 2237b0c

Browse files
ScrollListener to load more articles, change state of list on changing category.
1 parent f4271db commit 2237b0c

File tree

4 files changed

+57
-12
lines changed

4 files changed

+57
-12
lines changed

app/src/main/java/com/developerbreach/developerbreach/view/category/CategoryBindingAdapter.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ fun MaterialCardView.setItemCategoryParentListener(
2020
viewModel: ArticleListViewModel,
2121
) {
2222
this.setOnClickListener {
23-
viewModel.getArticlesBasedOnCategoryId(category)
23+
viewModel.saveUserSelectedCategory(category)
2424
}
2525
}
2626

app/src/main/java/com/developerbreach/developerbreach/view/list/ArticleListBindingAdapter.kt

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,23 +19,51 @@ import com.developerbreach.developerbreach.utils.capitalizeWord
1919
import com.google.android.material.card.MaterialCardView
2020

2121

22-
@BindingAdapter("bindArticlesListDataByCategory")
22+
@BindingAdapter(
23+
"bindArticlesListDataByCategory",
24+
"bindArticleListViewModel",
25+
)
2326
fun RecyclerView.setArticleListDataByCategory(
24-
list: List<Article>?
27+
list: List<Article>?,
28+
viewModel: ArticleListViewModel
2529
) {
2630
val adapter = ArticleAdapter()
2731
// Pass list to adapter calling submitList since our adapter class extends to ListAdapter<>.
2832
adapter.submitList(list)
2933
// Set adapter with recyclerView.
3034
this.adapter = adapter
3135

36+
this.addOnScrollListener(articlesScrollListener(viewModel))
37+
3238
if (list?.isNotEmpty() == true) {
3339
this.visibility = View.VISIBLE
3440
} else {
3541
this.visibility = View.GONE
3642
}
3743
}
3844

45+
private var isFirstTimeCall = true
46+
47+
private fun articlesScrollListener(
48+
viewModel: ArticleListViewModel
49+
): RecyclerView.OnScrollListener = object : RecyclerView.OnScrollListener() {
50+
51+
override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
52+
super.onScrollStateChanged(recyclerView, newState)
53+
54+
if (!recyclerView.canScrollVertically(1) && newState == RecyclerView.SCROLL_STATE_IDLE) {
55+
if (isFirstTimeCall) {
56+
isFirstTimeCall = false
57+
viewModel.loadMoreArticles()
58+
}
59+
}
60+
61+
if (!recyclerView.canScrollVertically(1) && newState == RecyclerView.SCROLL_STATE_DRAGGING) {
62+
isFirstTimeCall = true
63+
}
64+
}
65+
}
66+
3967

4068
@BindingAdapter("bindSelectedCategoryText")
4169
fun TextView.setSelectedCategoryText(
@@ -109,7 +137,7 @@ fun MaterialCardView.setArticleToDetailClickListener(
109137
card.setOnClickListener {
110138
TransitionManager.beginDelayedTransition(card, Fade())
111139
title.visibility = View.GONE
112-
AppNavDirections(findNavController()).articlesListToDetail(articleId, card)
140+
AppNavDirections(findNavController()).fragmentsToDetailFragment(articleId, card)
113141
}
114142
}
115143

app/src/main/java/com/developerbreach/developerbreach/view/list/ArticleListViewModel.kt

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,16 @@ class ArticleListViewModel constructor(
4141
val articlesState: LiveData<DataState>
4242
get() = _articlesState
4343

44+
private var loadNextPage: Int = 1
45+
46+
private lateinit var selectedCategory: Categories
47+
48+
fun saveUserSelectedCategory(category: Categories) {
49+
loadNextPage = 1
50+
selectedCategory = category
51+
loadArticlesWithSelectedCategory()
52+
}
53+
4454
init {
4555
launchToLoadCategoriesData()
4656
}
@@ -59,14 +69,22 @@ class ArticleListViewModel constructor(
5969
}
6070
}
6171

62-
fun getArticlesBasedOnCategoryId(
63-
category: Categories
64-
) {
72+
fun loadMoreArticles() {
73+
loadNextPage += 1
74+
loadArticlesWithSelectedCategory()
75+
Timber.e("Current page $loadNextPage")
76+
}
77+
78+
private fun loadArticlesWithSelectedCategory() {
6579
viewModelScope.launch {
6680
_articlesState.value = DataState.LOADING
6781
try {
68-
_articles.postValue(repository.getArticlesByCategoryId(category.categoryId))
69-
_selectedCategoryName.postValue(category.categoryName)
82+
val articlesById = repository.getArticlesByCategory(
83+
selectedCategory.categoryId,
84+
loadNextPage
85+
)
86+
_articles.postValue(articlesById)
87+
_selectedCategoryName.postValue(selectedCategory.categoryName)
7088
_articlesState.value = DataState.DONE
7189
} catch (e: Exception) {
7290
Timber.e("Exception caught in ArticleListViewModel ${e.message}")

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -115,16 +115,15 @@
115115
android:orientation="vertical"
116116
android:paddingTop="12dp"
117117
android:scrollbars="none"
118+
app:bindArticleListViewModel="@{viewModel}"
118119
app:bindArticlesListDataByCategory="@{viewModel.articlesByCategory}"
119120
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
120121
app:layout_constraintBottom_toBottomOf="parent"
121122
app:layout_constraintStart_toStartOf="parent"
122123
app:layout_constraintTop_toBottomOf="@id/hor_line_category"
123-
app:reverseLayout="true"
124-
app:stackFromEnd="true"
125124
tools:itemCount="6"
126125
tools:listitem="@layout/item_article"
127-
tools:visibility="gone" />
126+
tools:visibility="invisible" />
128127

129128
<ImageView
130129
android:id="@+id/select_category_background_image_view"

0 commit comments

Comments
 (0)