web-dev-qa-db-fra.com

kotlin RecyclerView Pagination

Je dois faire en sorte que mon RecyclerView ne charge que 10 éléments et en charge 10 de plus après le défilement et fonctionne comme ceci.
J'ajoutais les éléments du tableau à l'aide de Volley.
Voici mon adaptateur RecyclerView.

class newsAdapter constructor(private val activety:MainActivity, private val ListOfCash:ArrayList<newsModling>,
                          val listener:BTNListener): RecyclerView.Adapter<newsAdapter.ViewHolder>(),BTNListener {

    override fun getItemCount(): Int = ListOfCash.size

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        return ViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.news_tick, parent, false))
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.bind(ListOfCash[position], listener, ListOfCash)
    }

    inner class ViewHolder(itemView: View?) : RecyclerView.ViewHolder(itemView) {
        fun bind(Data: newsModling, listener: BTNListener, listOfnew: ArrayList<newsModling>) {
            var ListOfnewsin = listOfnew[adapterPosition]

            var newstitle = ListOfnewsin.title
            var newsdate = ListOfnewsin.date

            itemView.newsDate.text = newsdate
            itemView.newsTitle.text = newstitle

            itemView.setOnClickListener{
                //var cashSTR = cashNumIn.toString()
            }
        }
    }
}

Je ne sais pas ce que je dois utiliser ni où je vais le taper.

5
Nasser El Arab

Essayez d'utiliser cet écouteur de défilement avec votre recyclerview.

Dans charger plus d'éléments, placez votre logique pour charger plus d'éléments.

isLastPage renverra true s'il n'y a aucun élément à charger.

isLoading sera vrai pendant que vous récupérez des données et faux lorsque vous aurez récupéré les données.

import Android.support.v7.widget.LinearLayoutManager
import Android.support.v7.widget.RecyclerView

/**
 * Pagination class to add more items to the list when reach the last item.
 */
abstract class PaginationScrollListener
/**
 * Supporting only LinearLayoutManager for now.
 *
 * @param layoutManager
 */
(var layoutManager: LinearLayoutManager) : RecyclerView.OnScrollListener() {

    abstract fun isLastPage(): Boolean

    abstract fun isLoading(): Boolean

    override fun onScrolled(recyclerView: RecyclerView?, dx: Int, dy: Int) {
        super.onScrolled(recyclerView, dx, dy)

        val visibleItemCount = layoutManager.childCount
        val totalItemCount = layoutManager.itemCount
        val firstVisibleItemPosition = layoutManager.findFirstVisibleItemPosition()

        if (!isLoading() && !isLastPage()) {
            if (visibleItemCount + firstVisibleItemPosition >= totalItemCount && firstVisibleItemPosition >= 0) {
                loadMoreItems()
            }//                    && totalItemCount >= ClothesFragment.itemsCount
        }
    }
    abstract fun loadMoreItems()
}

Ajoutez ceci à votre recyclerview

var isLastPage: Boolean = false
var isLoading: Boolean = false

recyclerView?.addOnScrollListener(object : PaginationScrollListener(your_layoutManager) {
    override fun isLastPage(): Boolean {
        return isLastPage
    }

    override fun isLoading(): Boolean {
        return isLoading
    }

    override fun loadMoreItems() {
        isLoading = true
        //you have to call loadmore items to get more data 
        getMoreItems()
    }
})    

fun getMoreItems() {
    //after fetching your data assuming you have fetched list in your 
    // recyclerview adapter assuming your recyclerview adapter is 
    //rvAdapter
    after getting your data you have to assign false to isLoading 
    isLoading = false    

    rvAdapter.addData(list)
}

Maintenant, dans votre adaptateur recyclerview, ajoutez la méthode suivante.

Ici, la liste est la liste qui alimente votre recyclerview dans votre adaptateur.
Assurez-vous d'initialiser la liste dans votre recyclerview.

fun addData(listItems: ArrayList<yourObject>) {
    var size = this.listItems.size
    this.listItems.addAll(listItems)
    var sizeNew = this.listItems.size
    notifyItemRangeChanged(size, sizeNew)
}
10
Rohit Sharma