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 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