RecyclerView 性能优化


RecyclerView 是 Android 中常用的列表控件,性能优劣直接影响应用流畅度。下面先简单介绍基础用法,再深入聊聊性能优化技巧。

一、基础使用方法

  1. 布局文件中添加 RecyclerView:
1
2
3
4
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
  1. 在 Activity 或 Fragment 中设置适配器和布局管理器:
1
2
3
4
RecyclerView recyclerView = findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(this)); // 线性布局
MyAdapter adapter = new MyAdapter(dataList);
recyclerView.setAdapter(adapter);
  1. 创建适配器时实现必要方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {

private List<String> dataList;

public MyAdapter(List<String> data) {
this.dataList = data;
}

public static class ViewHolder extends RecyclerView.ViewHolder {
TextView textView;
public ViewHolder(View v) {
super(v);
textView = v.findViewById(R.id.textView);
}
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_layout, parent, false);
return new ViewHolder(v);
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.textView.setText(dataList.get(position));
}

@Override
public int getItemCount() {
return dataList.size();
}
}

二、性能优化技巧

  1. 避免重复创建视图
    RecyclerView 内部通过 ViewHolder 缓存视图,确保 onCreateViewHolder 只创建必要的视图。要保证 onBindViewHolder 只绑定数据,不做创建操作。

  2. 合理使用 setHasFixedSize(true)
    如果列表大小固定不变,调用此方法可提高性能,避免不必要的布局计算。

1
recyclerView.setHasFixedSize(true);
  1. 使用合适的布局管理器
  • LinearLayoutManager:简单列表,性能好。
  • GridLayoutManagerStaggeredGridLayoutManager:复杂网格布局,适当调整缓存策略。
  1. 减少层级嵌套和复杂布局
    复杂的布局层次会导致测量和绘制时间增加,尽量扁平化布局。

  2. 使用差异更新(DiffUtil)
    更新数据时使用 DiffUtil 只刷新变化的部分,避免全量刷新。

1
2
DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(callback);
diffResult.dispatchUpdatesTo(adapter);
  1. 图片加载优化
    使用 Glide、Picasso 等库异步加载图片,避免主线程阻塞,并做好内存缓存。

  2. 预加载和缓存
    设置 setItemViewCacheSize 适当缓存更多视图,预加载提高滑动流畅度。

  3. 避免不必要的请求布局
    尽量减少调用 notifyDataSetChanged(),优先使用细粒度的 notifyItemChanged()notifyItemInserted() 等。


欢迎大佬们补充交流,一起把列表滑动做到飞起!