如何在 kotlin 的 Recycler View Adapter 中添加更多数据列表而不清除先前的数据?

Posted

技术标签:

【中文标题】如何在 kotlin 的 Recycler View Adapter 中添加更多数据列表而不清除先前的数据?【英文标题】:How to add more list of data without clearing the previous in Recycler View Adapter in kotlin? 【发布时间】:2021-10-23 09:10:39 【问题描述】:

我正在尝试创建一个回收器视图,当用户向下滚动时加载更多数据而不删除前一个单元格。例如:(Instagram,推特...)

当我向下滚动时,新数据会在所有回收器视图单元格中获取前一个单元格和新单元格。

所以如果我有 10 个单元格,那么我向下滚动,它会得到另一个新的 10 个单元格,但是现在所有 20 个单元格都相同,并且前 10 个被替换。

主要片段

        photosList.layoutManager = mLayoutManager

        viewModel.refresh()
        photosList.apply 
            layoutManager = LinearLayoutManager(context)
            adapter = photosAdapter
        

        observeViewModel()

        photosList.addOnScrollListener(object : RecyclerView.OnScrollListener() 
            override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) 
                if (dy > 0)  //check for scroll down
                    //visibleItemCount = mLayoutManager.childCount
                    var layoutManager = photosList.layoutManager as LinearLayoutManager
                    visibleItemCount =
                        layoutManager.findLastVisibleItemPosition() - layoutManager.findFirstVisibleItemPosition() + 1
                    totalItemCount = layoutManager.itemCount
                    pastVisibleItems = layoutManager.findFirstVisibleItemPosition()
                    if (loading) 
                        if (visibleItemCount + pastVisibleItems >= totalItemCount) 
                            loading = false

                            // Fetch new data
                            viewModel.fetchMorePhotos()
                            observeViewModelGetMore()

                            loading = true
                        
                    
                
            
        )

视图模型

fun fetchMorePhotos() 
        pageNumber += 1
        fetchPhotos()
    

    private fun fetchPhotos() 
        loading.value = true
        //loading2.value = true
        disposable.add(
            PhotosService.getPhotos(pageNumber)
                .subscribeOn(Schedulers.newThread())
                .observeOn(androidSchedulers.mainThread())
                .subscribeWith(object : DisposableSingleObserver<List<PhotoData>>() 
                    override fun onSuccess(value: List<PhotoData>?) 
                        Photos.value = value!!
                        PhotoLoadError.value = false
                        loading.value = false
                        //loading2.value = false
                    

                    override fun onError(e: Throwable?) 
                        PhotoLoadError.value = true
                        loading.value = false
                        //loading2.value = false
                    

                )
        )
    

适配器

class PhotoListAdapter(
    var photos: ArrayList<PhotoData>,
    private var click_listener: OnPhotoItemClickListner
) :
    RecyclerView.Adapter<PhotoListAdapter.PhotoViewHolder>() 
    fun updatePhotos(newPhotos: List<PhotoData>) 
        photos.clear()
        photos.addAll(newPhotos)
        notifyDataSetChanged()
    

    fun getMorePhotos(newPhotos: List<PhotoData>) 
        val position: Int = photos.size + 1
        photos.addAll(newPhotos)
        notifyItemChanged(position,newPhotos)
    

【问题讨论】:

【参考方案1】:

无限滚动是一个复杂的话题,我不会尝试自己解决。您需要使用 Android Paging 库:

https://proandroiddev.com/infinite-scrolling-with-android-paging-library-and-flow-api-e017f47517d6

【讨论】:

以上是关于如何在 kotlin 的 Recycler View Adapter 中添加更多数据列表而不清除先前的数据?的主要内容,如果未能解决你的问题,请参考以下文章

kotlin Recycler查看分页

我似乎无法将我的Kotlin Recycler多视图代码整理出来

如何使用 kotlin 实现分页

如何使用 lambda 而不是 kotlin 接口

如何使reyclerview项目可见并且不留空间--Kotlin?

kotlin android中Recyclerview的适配器类