最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
RecyclerView.Adapter 进阶 ListAdapter
时间:2026-06-02 16:45:01 编辑:袖梨 来源:一聚教程网
RecyclerView.Adapter升级为ListAdapter是提升列表性能的关键步骤,本文将对比新旧实现方式的差异。
RecyclerView.Adapter → ListAdapter
老写法(Java)
public class MyAdapter extends RecyclerView.Adapter { private List- items = new ArrayList<>();
public void setData(List- newItems)
{
items.clear();
items.addAll(newItems);
notifyDataSetChanged();
} @NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_row, parent, false);
return new ViewHolder(view);
} @Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Item item = items.get(position);
holder.tvName.setText(item.getName());
} @Override
public int getItemCount() {
return items.size();
} static class ViewHolder extends RecyclerView.ViewHolder {
TextView tvName;
ViewHolder(View itemView) {
super(itemView);
tvName = itemView.findViewById(R.id.tv_name);
}
}
}
问题在哪里
传统实现方式使用notifyDataSetChanged()会导致整个列表刷新,不仅失去动画效果,还会造成滚动位置跳动。当数据量较大时,这种操作会引发明显的卡顿问题。

新写法(Kotlin + ListAdapter)
class MyAdapter : ListAdapter<Item, MyAdapter.ViewHolder>(DiffCallback) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent.context)
.inflate(R.layout.item_row, parent, false)
return ViewHolder(view)
} override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.tvName.text = getItem(position).name
} class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val tvName: TextView = itemView.findViewById(R.id.tv_name)
} companion object {
private val DiffCallback = object : DiffUtil.ItemCallback- () {
override fun areItemsTheSame(oldItem: Item, newItem: Item) =
oldItem.id == newItem.id override fun areContentsTheSame(oldItem: Item, newItem: Item) =
oldItem == newItem
}
}
}data class Item(val id: Long, val name: String)
更新数据时只需调用:
adapter.submitList(newList)
一句话注意
submitList()方法会在后台线程执行差异计算,避免阻塞主线程。但需要注意避免在高频更新场景下频繁创建新列表。
当列表项内容发生变化时,必须正确实现areContentsTheSame方法。其中areItemsTheSame用于判断是否为同一项,areContentsTheSame则判断内容是否发生变化。
通过ListAdapter实现差异更新能显著提升列表性能,是Android开发中值得掌握的优化技巧。
相关文章
- 燕云十六声稀有坐骑琳琅雪如何获得-完整获取流程指南 06-02
- Ubuntu系统安装数据库操作指南 06-02
- 卡厄思梦境自选五星角色如何挑选 06-02
- 肯德基app消息通知关闭方法指南 06-02
- 热门电视剧APP排行榜 实用追剧软件下载推荐 06-02
- CentOS如何通过cryptsetup实现磁盘加密 06-02