android / android/codelab-android-paging

Calling refresh() method twice, stops the pagination.

Open
#223 3 comments 0 reactions 0 assignees View on GitHub
Dominant language
Kotlin
Stars
509
Forks
268
PR merge metrics
No merged PRs in 30d

Description

I'm able to populate the list and pagination is working as expected. But when I call adapter.refresh() method twice by using pull to refresh, the pagination stops working.

Please refer the below video to get the better idea about the prolem.
https://www.dropbox.com/s/0k2g9mlktv5gee6/22-05-22-10-26-37.mp4?dl=0

**VideoPagingSource.kt**
```
class VideoPagingSource(
private val apiInterface: ApiInterface,
private val schoolId: String,
private val ordering: String?,
private val courseId: String?,
private val moduleId: String?,
private val searchText: String?
) : PagingSource() {

override fun getRefreshKey(state: PagingState): Int? = null

override suspend fun load(params: LoadParams): LoadResult {
val pageNumber = params.key
return try {
val response = apiInterface.getVideos(schoolId, ordering, courseId, moduleId, searchText, pageNumber)
val pagedResponse = response?.body()
var nextPageNumber: Int? = null
if (pagedResponse?.links?.next != null) {
val uri = Uri.parse(pagedResponse.links.next)
val nextPageQuery = uri.getQueryParameter("page")
nextPageNumber = nextPageQuery?.toInt()
}

LoadResult.Page(
data = response?.body()?.objects.orEmpty(),
prevKey = null,
nextKey = nextPageNumber
)
} catch (e: Exception) {
LoadResult.Error(e)
}
}

}
```
**PreClassViewModel.kt**

```
class PreClassViewModel @Inject constructor(private val repository: PreClassRepository) :
ViewModel() {

private val queryParamLiveData = MutableLiveData()

val videosLiveData = queryParamLiveData.switchMap {

repository.getVideos(
schoolId = it.extraArgs[0],
ordering = it.extraArgs[1],
courseId = it.courseId,
moduleId = it.chapterId,
searchText = it.searchText
).cachedIn(viewModelScope)

}

fun setQueryParam(queryParams: QueryParams){
queryParamLiveData.value = queryParams
}

}
```
**VideosFragment.kt**
```
class VideosFragment : BaseFragment(FragmentVideosBinding::inflate),
VideosPagingAdapter.VideoClickListener {

private val viewModel by viewModels()
private var chapter: ModulesItem? = null
private var courseId: String? = null
private var adapter: VideosPagingAdapter? = null

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

chapter = Gson().fromJson(arguments?.getString(BUNDLE_CHAPTER), ModulesItem::class.java)
courseId = arguments?.getString(BUNDLE_COURSE_ID)

viewModel.setQueryParam(
QueryParams(
courseId = courseId,
chapterId = chapter?.id.toString(),
searchText = null,
me?.academicProfile?.school?.id?.toString()!!,
"sequence",
)
)

}

override fun initView() {
getMainActivity().showBothNavigation()
getMainActivity().showBackButton()

adapter = VideosPagingAdapter(chapter?.imageUrl, this)
binding.videoRV.adapter = adapter!!.withLoadStateFooter(footer = DefaultFooterAdapter())
lifecycleScope.launch {
adapter?.loadStateFlow?.collectLatest {

binding.progressBar.isVisible = it.refresh is LoadState.Loading

if (binding.swipeContainer.isRefreshing){
binding.swipeContainer.isRefreshing = it.refresh is LoadState.Loading
}

}
}

}

override fun initListener() {
binding.swipeContainer.setOnRefreshListener {
adapter?.refresh()
}
}

override fun addObserver() {

viewModel.videosLiveData.observe(viewLifecycleOwner) {
adapter?.submitData(viewLifecycleOwner.lifecycle, it)

}

}

override var setSelection: String
get() = Constants.FEATURE_LEARN
set(value) {}

override fun onVideoClick(video: Video) {

}

}
```

Contributor guide

Open the contributing guide

Research direction

Start by reproducing the double-refresh behavior in VideosFragment using the provided pull-to-refresh flow, then trace adapter.refresh(), submitData(), and loadStateFlow alongside VideoPagingSource.kt and PreClassViewModel.kt. Done means pagination continues working after refresh() is called twice and the refresh state still clears correctly.

Written by the indexing model from the issue text.

Assessment

Tech stack
android, kotlin
Domain
mobile
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.