Android性能优化RecyclerView预加载LayoutManager的getExtraLayoutSpace,Kotlin

Android性能优化RecyclerView预加载LayoutManager的getExtraLayoutSpace,Kotlin

RecyclerView默认只加载当前屏幕肉眼可见区域的有限item数量,有些场景下,需要在屏幕外不可见的区域多加载一批item出来,这有时候被称之为"预加载",实现预加载的方式很多,RecyclerView的标准实现可以通过getExtraLayoutSpace实现。

Kotlin 复制代码
import android.content.Context
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView


class MainActivity : AppCompatActivity() {
    companion object {
        const val TAG = "fly"
        const val VIEW_TYPE = 0

        const val PRELOAD_SIZE = 10 //预加载多少条item,即Extra(多加载出来多高的内容)
        const val ITEM_HEIGHT_PIX = 100 //每条item的高度,单位pix
    }

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

        val rv = findViewById<RecyclerView>(R.id.rv)
        val layoutManager = MyLinearLayoutManager(this)
        layoutManager.orientation = LinearLayoutManager.VERTICAL
        rv.layoutManager = layoutManager

        val adapter = MyAdapter(this)
        rv.adapter = adapter
    }

    class MyAdapter : RecyclerView.Adapter<MyVH> {
        constructor(ctx: Context) {

        }

        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyVH {
            val view = LayoutInflater.from(parent.context).inflate(android.R.layout.simple_list_item_1, parent, false)
            view.layoutParams.height = ITEM_HEIGHT_PIX
            return MyVH(view)
        }

        override fun getItemCount(): Int {
            return Int.MAX_VALUE
        }

        override fun getItemViewType(position: Int): Int {
            return VIEW_TYPE
        }

        override fun onBindViewHolder(holder: MyVH, position: Int) {
            Log.d(TAG, "onBindViewHolder $position")
            holder.pos.text = "$position"
        }
    }

    class MyVH(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val pos: TextView = itemView.findViewById(android.R.id.text1)
    }

    class MyLinearLayoutManager : LinearLayoutManager {
        constructor(ctx: Context, data: Any? = null) : super(ctx) {

        }

        override fun getExtraLayoutSpace(state: RecyclerView.State?): Int {
            return PRELOAD_SIZE * ITEM_HEIGHT_PIX
        }
    }
}

注意,getExtraLayoutSpace返回的是屏幕外不可见区域需要预加载的所有item总高度,单位是pix。上面要预加载10条,每条item高度是100pix,也就是说,正确的情况下,如果RecyclerView不作任何调优,那它只加载当前屏幕可见区域position为0~21的item(每个item高度为100pix),如果配置了getExtraLayoutSpace,那么会多(Extra)加载10条position为22~31的item,其中22~31为屏幕底部不可见的区域中内容,被"预加载"出来。

Android Glide load grid RecyclerView scroll smooth, high performance and ,Kotlin-CSDN博客文章浏览阅读397次,点赞14次,收藏8次。【代码】Android Paging 3,kotlin(1)在实际的开发中,虽然Glide解决了快速加载图片的问题,但还有一个问题悬而未决:比如用户的头像,往往用户的头像是从服务器端读出的一个普通矩形图片,但是现在的设计一般要求在APP端的用户头像显示成圆形头像,那么此时虽然Glide可以加载,但加载出来的是一个矩形,如果要Glide_android 毛玻璃圆角。现在结合他人的代码加以修改,给出一个以原始图形中心为原点,修剪图片为头像的工具类,此类可以直接在布局文件中加载使用,比。文章浏览阅读670次。https://blog.csdn.net/zhangphil/article/details/137520793

Android RecyclerView AsyncListDiffer DiffUtil,Kotlin(a)-CSDN博客文章浏览阅读720次,点赞3次,收藏9次。文章浏览阅读410次。基于Android官方Paging Library的RecyclerView分页加载框架我之前写了一篇RecyclerView分页加载机制的文章,是基于Android官方的AsyncListUtil实现的,详情见附录文章1。基于Android官方Paging Library的RecyclerView分页加载框架我之前写了一篇RecyclerView分页加载机制的文章,是基于Android官方的AsyncListUtil实现的,详情见附录文章1。https://blog.csdn.net/zhangphil/article/details/136204914Android RecyclerView page/paging load,based on AsyncListUtil,kotlin(4)-CSDN博客文章浏览阅读501次。基于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/130786520Android RecyclerView AsyncListDiffer DiffUtil,Kotlin(b)-CSDN博客文章浏览阅读375次。【代码】Android RecyclerView AsyncListDiffer DiffUtil,Kotlin(b)https://blog.csdn.net/zhangphil/article/details/136218639Android RecyclerView AsyncListUtil手动刷新fillData,kotlin-CSDN博客文章浏览阅读428次。基于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/131519811

相关推荐
无极程序员1 小时前
PHP常量
android·ide·android studio
萌面小侠Plus3 小时前
Android笔记(三十三):封装设备性能级别判断工具——低端机还是高端机
android·性能优化·kotlin·工具类·低端机
慢慢成长的码农3 小时前
Android Profiler 内存分析
android
大风起兮云飞扬丶3 小时前
Android——多线程、线程通信、handler机制
android
L72563 小时前
Android的Handler
android
清风徐来辽3 小时前
Android HandlerThread 基础
android
HerayChen4 小时前
HbuildderX运行到手机或模拟器的Android App基座识别不到设备 mac
android·macos·智能手机
顾北川_野4 小时前
Android 手机设备的OEM-unlock解锁 和 adb push文件
android·java
hairenjing11234 小时前
在 Android 手机上从SD 卡恢复数据的 6 个有效应用程序
android·人工智能·windows·macos·智能手机
小黄人软件4 小时前
android浏览器源码 可输入地址或关键词搜索 android studio 2024 可开发可改地址
android·ide·android studio