目录
- 为什么有时候会一次性加载全部的item呢?
一、为什么有时候会一次性加载全部的item呢?这样会导致第一次加载显示出来的时间过长
RecyclerView本身是非常高效的,它只渲染和保持屏幕上可见的以及即将进入屏幕的items。
但,当RecyclerView的宽度和高度设置wrap_content时,会导致全部item一次性加载,原因是,RecyclerView无法根据父容器的来动态计算可见区域。它会根据所有item的尺寸来确定自身的寸。这意味着RecyclerView会将所有的item都实例化并布局出来,以便测量它们的尺寸,并根据这些尺寸来确定RecyclerView的最终尺寸。
如果RecyclerView中有大量的item,或者每个item的内容比较复杂,那么这种可能会导致内存消耗过高、卡顿等问题。
比如:代码如下:数据有5个
class FragmentOne : Fragment() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_one, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
var recyclerView : MyRecyclerView = view.findViewById(R.id.rv_fragment_one)
// 设置布局管理器
recyclerView.layoutManager = LinearLayoutManager(requireContext())
// 示例数据
val data = listOf("Item 1", "Item 2", "Item 3", "Item 4", "Item 5")
// 设置Adapter
val adapter = MyAdapter(data)
recyclerView.adapter = adapter
}
}
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_fragment_one"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
界面可显示的内容有3个:
但看log日志,会5个item都创建。解决方法就是给高度设置固定高度或者match_parent。
注意
在Android 5和7上,这个RecyclerView的高度设置为wrap_content时会导致全部item一次性加载的情况。这是因为在旧版本的Android中RecyclerView无法根据父容器的大小来动态计算可见区域。
然而,在Android 11及更高版本中,RecyclerView的行为发生了变化。RecyclerView的高度设置为wrap_content时,它会根据屏幕尺寸和布局约束来动态计算可见区域,并只实例化和布局显示在屏幕上的item。这样可以避免一次性加载全部item,提升性能和用户体验。
这个改变是由于RecyclerView在Android 11中引入了新的测量机制,称为"adaptive measurement"(自适应测量)。通过使用这种测量机制,RecyclerView能够更好地处理高度设置为wrap_content`的情况,以便按需加载item并正确计算可见区域。