kotlin Recycler查看分页

Posted

技术标签:

【中文标题】kotlin Recycler查看分页【英文标题】:kotlin RecyclerView Pagination 【发布时间】:2018-12-28 05:00:48 【问题描述】:

我需要让我的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()
            
        
    

我不知道,我必须使用什么或在哪里输入。

【问题讨论】:

见developer.android.com/topic/libraries/architecture/paging和codelabs.developers.google.com/codelabs/android-paging/… 3 Android RecyclerView Load More On Scroll Examples 【参考方案1】:

尝试将此滚动侦听器与您的 recyclerview 一起使用。

在加载更多项目时,放置您的逻辑以加载更多项目。

如果没有要加载的项目,isLastPage 将返回 true。

isLoading 在您获取数据时为真,在您获取数据时为假。

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)

【讨论】:

如果你愿意,你可以在 android studio 中使用 ctrl+shift+altr+k 在 kotlin 中转换它,我可以给你一个 kotlin 可以的话请帮忙 非常感谢,但我仍然不知道热到 sed (var layoutManager: LinearLayoutManager) : RecyclerView.OnScrollListener() 从 recyclerView?.addOnScrollListener 到构造函数 我的意思是我将输入什么 (your_layoutManager) 我做了,但没有工作,请在 whatsapp 中与我交谈【参考方案2】:
class MainActivity : AppCompatActivity() 
    private var results = mutableListOf<MovieDetails>()
    lateinit var adapter: MovieAdapter
    private var pageNum = 1
    var page = -1
    var isLoading = false

    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        adapter = MovieAdapter(this@MainActivity, results)
        recycler_view.adapter = adapter
        val layoutManager = LinearLayoutManager(this@MainActivity)
        recycler_view.layoutManager = layoutManager
        getMovies()

        // RecyclerView Pagination********************************
        recycler_view.addOnScrollListener(object : RecyclerView.OnScrollListener()
            override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) 
                val visibleItemCount = layoutManager.childCount
                val pastVisibleItem = layoutManager.findFirstCompletelyVisibleItemPosition()
                val total = adapter.itemCount

                if (!isLoading) 

                    if ((visibleItemCount + pastVisibleItem) >= total) 
                        pageNum++
                        getMovies()
                    
                
                super.onScrolled(recyclerView, dx, dy)
            
        )


    

    private fun getMovies() 
        val movie: Call<Movies> = MovieService.movieInstance.getTrending(pageNum)
        movie.enqueue(object : Callback<Movies> 
            override fun onResponse(call: Call<Movies>, response: Response<Movies>) 
                val m = response.body()
                if (m != null) 
                    page = m.page
                    results.addAll(m.results)
                    adapter.notifyDataSetChanged()
                
            

            override fun onFailure(call: Call<Movies>, t: Throwable) 
            
        )
    

【讨论】:

虽然欢迎对旧问题的新答案,但如果您可以edit 您的答案并添加关于您的代码如何以更好/不同的方式解决问题的解释,那就更好了到接受的答案。

以上是关于kotlin Recycler查看分页的主要内容,如果未能解决你的问题,请参考以下文章

Android Kotlin:null 不能转换为非 null 类型 com.android.app.ui.category.CategoryAdapter.ViewHolder 想要在 recycl

Recycler View 和 DialogFragment 苦苦挣扎(Kotlin)

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

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

Recycler View重复,如何查看一次

如何使用 lambda 而不是 kotlin 接口