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

相关推荐
一切皆是定数21 分钟前
Android车载——VehicleHal初始化(Android 11)
android·gitee
一切皆是定数23 分钟前
Android车载——VehicleHal运行流程(Android 11)
android
problc24 分钟前
Android 组件化利器:WMRouter 与 DRouter 的选择与实践
android·java
图王大胜1 小时前
Android SystemUI组件(11)SystemUIVisibility解读
android·framework·systemui·visibility
服装学院的IT男5 小时前
【Android 13源码分析】Activity生命周期之onCreate,onStart,onResume-2
android
Arms2065 小时前
android 全面屏最底部栏沉浸式
android
服装学院的IT男5 小时前
【Android 源码分析】Activity生命周期之onStop-1
android
人间有清欢8 小时前
十、kotlin的协程
kotlin
吾爱星辰8 小时前
Kotlin 处理字符串和正则表达式(二十一)
java·开发语言·jvm·正则表达式·kotlin
ChinaDragonDreamer8 小时前
Kotlin:2.0.20 的新特性
android·开发语言·kotlin