Android RecyclerView page/paging load,based on AsyncListUtil,kotlin(4)

Android RecyclerView page/paging load,based on AsyncListUtil,kotlin(4)

import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.RecyclerView.OnScrollListener

class MainActivity : AppCompatActivity() {
    companion object {
        val TAG = "fly"
    }

    val mAdapter = MyAdapter()
    var mRecyclerView: RecyclerView? = null

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

        mRecyclerView = findViewById<RecyclerView>(R.id.recycler_view)
        mRecyclerView?.layoutManager = GridLayoutManager(this, 4).apply {
            orientation = GridLayoutManager.VERTICAL
        }

        mRecyclerView?.adapter = mAdapter

        //假设已经知道全量数据,后续的分段是把源数据一片一片的截出来,装到新的分页数据集里面
        val ITEMS = ArrayList<MyData>()
        for (i in 0..3000) {
            var data = MyData("@$i")
            ITEMS.add(data)
        }

        //新的分页数据集
        var pageItems: ArrayList<MyData>? = ArrayList()
        for (i in 0 until ITEMS.size) {
            pageItems?.add(MyData("-1"))
        }

        mAdapter.onChange(pageItems!!)


        PagingRecyclerViewUtil.PAGE_SIZE = 500
        var util =
            PagingRecyclerViewUtil(mRecyclerView!!, object : PagingRecyclerViewUtil.PagingListener {
                override fun onFillData(data: Array<out Any>, startPosition: Int, itemCount: Int) {
                    Log.d(TAG, "onFillData $startPosition $itemCount")
                    paging(ITEMS, pageItems!!, startPosition, itemCount)
                }
            })

        mRecyclerView?.addOnScrollListener(object : OnScrollListener() {
            override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
                util.onRangeChanged()
            }
        })

        //RecyclerView启动后默认滚到最底部
        mRecyclerView?.scrollToPosition(mAdapter.getItemCount() - 1)
    }

    fun paging(
        sourceItems: ArrayList<MyData>,
        pageItems: ArrayList<MyData>,
        startPosition: Int,
        itemCount: Int
    ) {
        var cnt = itemCount
        if ((startPosition + itemCount) > sourceItems.size) {
            cnt = sourceItems.size - startPosition
        }

        for (i in 0 until cnt) {
            var idx = startPosition + i
            pageItems?.set(idx, sourceItems.get(idx))
        }

        runOnUiThread {
            mAdapter.onChange(pageItems!!)
        }
    }
}

<?xml version="1.0" encoding="utf-8"?>
<androidx.recyclerview.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/recycler_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" />

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView

class MyAdapter() : RecyclerView.Adapter<MyViewHolder>() {
    var items: ArrayList<MyData>? = ArrayList()

    fun onChange(items: ArrayList<MyData>) {
        this.items = items
        this.notifyDataSetChanged()
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        val view = LayoutInflater.from(parent.context)
            .inflate(android.R.layout.simple_list_item_2, parent, false)
        return MyViewHolder(view)
    }

    override fun getItemCount(): Int {
        return items?.size!!
    }

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        holder.name.text = "$position"
        holder.desc.text = items?.get(position)?.desc
    }
}

class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
    val name: TextView = itemView.findViewById(android.R.id.text1)
    val desc: TextView = itemView.findViewById(android.R.id.text2)
}

data class MyData(var desc: String)

import android.util.Log
import androidx.recyclerview.widget.AsyncListUtil
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView

class PagingRecyclerViewUtil(rv: RecyclerView, pagingListener: PagingListener) {
    companion object {
        //每一页的数据数量
        //如果需要重新修改page_size值,需要在使用PagingRecyclerViewUtil之前
        //PagingRecyclerViewUtil.PAGE_SIZE = 500
        var PAGE_SIZE = 200
    }

    var mAsyncListUtil: AsyncListUtil<Any>? = null

    init {
        var myViewCallback = MyViewCallback(rv)
        var myDataCallback = MyDataCallback(pagingListener)
        mAsyncListUtil =
            AsyncListUtil(Any().javaClass, PAGE_SIZE, myDataCallback, myViewCallback)
    }

    fun onRangeChanged() {
        mAsyncListUtil?.onRangeChanged()
    }

    class MyDataCallback(var listener: PagingListener) : AsyncListUtil.DataCallback<Any>() {
        override fun refreshData(): Int {
            return Int.MAX_VALUE
        }

        override fun fillData(data: Array<out Any>, startPosition: Int, itemCount: Int) {
            //Log.d(MainActivity.TAG, "fillData startPosition=$startPosition itemCount=$itemCount")
            listener.onFillData(data, startPosition, itemCount)
        }
    }

    class MyViewCallback(private val recyclerView: RecyclerView) : AsyncListUtil.ViewCallback() {
        fun getOutRange(rv: RecyclerView, outRange: IntArray) {
            outRange[0] = (rv.layoutManager as GridLayoutManager?)!!.findFirstVisibleItemPosition()
            outRange[1] = (rv.layoutManager as GridLayoutManager?)!!.findLastVisibleItemPosition()
        }

        override fun getItemRangeInto(outRange: IntArray) {
            getOutRange(recyclerView, outRange);
            //Log.d(MainActivity.TAG, "getItemRangeInto ${outRange[0]}->${outRange[1]}")
        }

        override fun onDataRefresh() {
            //Log.d(MainActivity.TAG, "onDataRefresh")
        }

        override fun onItemLoaded(position: Int) {
            //Log.d(MainActivity.TAG, "onItemLoaded=$position")
        }
    }


    interface PagingListener {
        fun onFillData(data: Array<out Any>, startPosition: Int, itemCount: Int) {

        }
    }
}

Android Room联合AsyncListUtil实现RecyclerView分页加载ORM数据_zhangphil的博客-CSDN博客Android Room联合AsyncListUtil实现RecyclerView分页加载ORM数据我之前写了一系列关于AsyncListUtil实现RecyclerView和ListView的分页加载机制和技术路线,见附录文章4,5。同时也写了一些列文章介绍Android官方推出的ORM数据库:Room技术,见附录文章1,2。现在结合Android分页加载框架AsyncListUtil,以及Anhttps://blog.csdn.net/zhangphil/article/details/78661838

Android RecyclerView page/paging load,kotlin(3)_zhangphil的博客-CSDN博客基于Android官方Paging Library的RecyclerView分页加载框架我之前写了一篇RecyclerView分页加载机制的文章,是基于Android官方的AsyncListUtil实现的,详情见附录文章1。基于Android官方Paging Library的RecyclerView分页加载框架我之前写了一篇RecyclerView分页加载机制的文章,是基于Android官方的AsyncListUtil实现的,详情见附录文章1。【代码】Android Paging 3,kotlin(1)https://blog.csdn.net/zhangphil/article/details/130784241

Android Paging3/Page3 Cursor query segment photo into 3 grid RecyclerView,kotlin (2)_zhangphil的博客-CSDN博客基于Android官方Paging Library的RecyclerView分页加载框架我之前写了一篇RecyclerView分页加载机制的文章,是基于Android官方的AsyncListUtil实现的,详情见附录文章1。Android Paging Library是Android官方support。基于Android官方Paging Library的RecyclerView分页加载框架_android setmainthreadexecutor_zhangphil的博客-CSDN博客。https://blog.csdn.net/zhangphil/article/details/130751993

Android Paging 3 Flow or LiveData,kotlin(1)_zhangphil的博客-CSDN博客【代码】Android Paging 3,kotlin(1)https://blog.csdn.net/zhangphil/article/details/130735753

基于Android官方AsyncListUtil优化改进RecyclerView分页加载机制(一)_recyclerview 分页机制_zhangphil的博客-CSDN博客基于Android官方AsyncListUtil优化改进RecyclerView分页加载机制(一)Android AsyncListUtil是Android官方提供的专为列表这样的数据更新加载提供的异步加载组件。基于AsyncListUtil组件,可以轻易实现常见的RecyclerView分页加载技术。AsyncListUtil技术涉及的细节比较繁复,因此我将分别写若干篇文章,分点、分解Asynchttps://blog.csdn.net/zhangphil/article/details/78603499

Android分页加载刷新AsyncListUtil中DataCallback的refreshData()_zhangphil的博客-CSDN博客Android分页加载刷新AsyncListUtil中DataCallback的refreshData()Android分页加载刷新AsyncListUtil中DataCallback的refreshData()函数,返回值控制分页总数据量。如果返回一个既定的整型数据,那么AsyncListUtil的分页将在这个整型数据范围内分页和刷新,而不会超出这个范围。refreshData的实现源代码: ...https://blog.csdn.net/zhangphil/article/details/80492937

Android Room联合AsyncListUtil实现RecyclerView分页加载ORM数据_zhangphil的博客-CSDN博客Android Room联合AsyncListUtil实现RecyclerView分页加载ORM数据我之前写了一系列关于AsyncListUtil实现RecyclerView和ListView的分页加载机制和技术路线,见附录文章4,5。同时也写了一些列文章介绍Android官方推出的ORM数据库:Room技术,见附录文章1,2。现在结合Android分页加载框架AsyncListUtil,以及Anhttps://blog.csdn.net/zhangphil/article/details/78661838

猜你喜欢

转载自blog.csdn.net/zhangphil/article/details/130786520