Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

Calling refresh() method twice, stops the pagination.

Abierto
#223 3 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
3/5
Tiempo estimado
1-2 días
Aptitud para principiantes
35/100
Tipo de issue
Error
Claridad
Bastante claro
Estado de actividad
Estancado
Stack tecnológico
android, kotlin
Área
mobile

Línea de trabajo

Comienza reproduciendo el comportamiento de doble actualización en VideosFragment mediante el flujo de pull-to-refresh proporcionado; después, sigue adapter.refresh(), submitData() y loadStateFlow junto con VideoPagingSource.kt y PreClassViewModel.kt. Se considera terminado cuando la paginación sigue funcionando después de llamar dos veces a refresh() y el estado de actualización se sigue borrando correctamente.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

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<Int, Video>() {


    override fun getRefreshKey(state: PagingState<Int, Video>): Int? = null

    override suspend fun load(params: LoadParams<Int>): LoadResult<Int, Video> {
        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<QueryParams>()

    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>(FragmentVideosBinding::inflate),
    VideosPagingAdapter.VideoClickListener {

    private val viewModel by viewModels<PreClassViewModel>()
    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) {

    }

}
Lenguaje dominante
Kotlin
Estrellas
509
Forks
268
Métricas de merge de PR
Sin PR fusionados en 30 d

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de android/codelab-android-paging

Todos los issues de android/codelab-android-paging

Issues similares

Más issues de Kotlin

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.