在Android开发中,适配器(Adapter)是连接数据源与UI组件(如ListView、RecyclerView)的核心桥梁。本文将系统讲解如何构建Android适配器,并通过结构化数据对比和代码示例助您快速掌握核心技巧。

适配器主要负责:
1. 将数据集合转换为可视化的视图项
2. 管理列表项的生命周期
3. 实现视图复用机制优化性能
| 适配器类型 | 适用场景 | 核心特点 |
|---|---|---|
| BaseAdapter | ListView/GridView | 需手动实现getView()复用逻辑 |
| RecyclerView.Adapter | RecyclerView | 强制使用ViewHolder模式 |
| ArrayAdapter | 简单文本列表 | 自动处理单一TextView的绑定 |
这是最基础的适配器实现方式:
public class CustomAdapter extends BaseAdapter {
private List<DataModel> mData;
private LayoutInflater mInflater;
// 构造函数
public CustomAdapter(Context context, List<DataModel> data) {
this.mData = data;
mInflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return mData.size();
}
@Override
public Object getItem(int position) {
return mData.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_item, null);
holder = new ViewHolder();
holder.title = convertView.findViewById(R.id.tv_title);
holder.image = convertView.findViewById(R.id.iv_icon);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
DataModel item = mData.get(position);
holder.title.setText(item.getTitle());
Glide.with(convertView).load(item.getImageUrl()).into(holder.image);
return convertView;
}
static class ViewHolder {
TextView title;
ImageView image;
}
}
关键优化技巧:
1. ViewHolder模式:减少findViewById()调用次数
2. 视图复用:充分利用convertView参数
3. 异步加载:图片加载建议使用Glide/Picasso
RecyclerView适配器提供了更现代的解决方案:
public class ModernAdapter extends RecyclerView.Adapter<ModernAdapter.ViewHolder> {
class ViewHolder extends RecyclerView.ViewHolder {
TextView titleView;
ImageView iconView;
ViewHolder(View itemView) {
super(itemView);
titleView = itemView.findViewById(R.id.tv_title);
iconView = itemView.findViewById(R.id.iv_icon);
}
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_item, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
DataModel item = dataList.get(position);
holder.titleView.setText(item.getTitle());
Glide.with(holder.itemView).load(item.getIconUrl()).into(holder.iconView);
}
}
| 组件 | 作用 |
|---|---|
| onCreateViewHolder | 创建新视图项时调用 |
| onBindViewHolder | 绑定数据到视图项 |
| getItemCount | 返回数据总量(必须实现) |
| getItemViewType | 实现多布局类型的关键方法 |
1. 多类型视图支持
通过重写getItemViewType()返回不同布局类型,在onCreateViewHolder中根据viewType加载不同布局。
2. 数据差异化更新
RecyclerView提供了DiffUtil工具类,可智能计算数据变更:
DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new MyCallback(oldList, newList)); diffResult.dispatchUpdatesTo(adapter);
3. 与数据绑定库结合
使用DataBinding可大幅简化视图绑定过程:
<layout>
<data>
<variable name="item" type="com.example.DataModel"/>
</data>
<TextView android:text="@{item.title}" />
</layout>
4. 分页加载实现
通过Paging3库可轻松实现分页加载:
class MyPagingSource extends PagingSource<Int, DataItem> {
override suspend fun load(params: LoadParams<Int>): LoadResult<Int, DataItem> {
val page = params.key ?: 1
val data = repository.loadPage(page)
return LoadResult.Page(
data = data,
prevKey = if (page == 1) null else page - 1,
nextKey = page + 1
)
}
}
1. 避免在onBindViewHolder进行耗时操作
2. 复杂列表建议使用PrecomputedTextCompat处理文本
3. 滚动时暂停图片加载
4. 使用setHasFixedSize(true)优化布局计算
5. 嵌套滚动使用NestedScrollView需谨慎处理
通过掌握这些适配器构建方法,开发者可以创建出高性能、易维护的列表视图。建议实际开发中优先选择RecyclerView+DataBinding的技术组合,特别是在需要实现复杂交互或动态布局的场景下,这种组合能显著提升开发效率和执行性能。