RecyclerView.Adapter 进阶 ListAdapter

作者:袖梨 2026-06-02

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()会导致整个列表刷新,不仅失去动画效果,还会造成滚动位置跳动。当数据量较大时,这种操作会引发明显的卡顿问题。

RecyclerView.Adapter → ListAdapter

新写法(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开发中值得掌握的优化技巧。

相关文章

精彩推荐