web-dev-qa-db-ja.com

kotlin RecyclerViewページネーション

RecyclerViewに10個のアイテムのみをロードし、スクロール後にさらに10個のアイテムをロードして、このように動作させる必要があります。
Volleyを使用して配列にアイテムを追加しました。
これは私の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()
            }
        }
    }
}

何を使用しなければならないのか、どこに入力するのかわかりません。

5
Nasser El Arab

このスクロールリスナーをrecyclerviewで使用してみてください。

より多くのアイテムをロードするには、より多くのアイテムをロードするロジックを配置します。

ロードするアイテムがない場合、isLastPageはtrueを返します。

isLoadingは、データのフェッチ中はtrue、データのフェッチ中はfalseになります。

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()
}

これを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)
}

recyclerviewアダプタに次のメソッドを追加します。

ここでのリストは、アダプターのrecyclerviewにフィードするリストです。
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