引言
在 Android 开发初期,面对庞大的 API 体系,很多开发者容易感到无从下手。以 ListView、GridView 或 Spinner 为例,它们都需要通过适配器(Adapter)来将数据源映射到具体的 View 上。最近我在负责一个文件管理器的功能模块时,需要展示文件图标及详细信息,于是编写了一个继承自 BaseAdapter 的 FileAdapter。
核心方法解析
实现一个标准的 BaseAdapter 主要涉及四个必须重写的方法。理解它们的调用时机对调试至关重要:
- getCount:返回数据集合的大小,决定了列表中 Item 的数量。
- getItem:获取指定位置的数据对象。
- getItemId:返回指定位置的行 ID,通常用于标识唯一性。
- getView:这是最核心的部分。它负责根据 position 绘制每一个 Item 的 View。
在实际运行中,系统会根据数据量多次调用 getView。为了提升性能,我们通常会在这里引入 ViewHolder 模式来复用 convertView,避免频繁的 findViewById 操作。
代码实现
下面是一个完整的 FileAdapter 示例,展示了如何初始化布局、绑定数据以及处理不同类型的文件图标。注意这里修正了原代码中字符串比较的写法,确保逻辑严谨。
public class FileAdapter extends BaseAdapter {
private Context mContext;
private LayoutInflater mInflater;
private List<FileItem> mListFile;
public FileAdapter(Context context, List<FileItem> list) {
this.mContext = context;
this.mListFile = list;
this.mInflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return mListFile == null ? 0 : mListFile.size();
}
@Override
public Object getItem(int position) {
return mListFile.get(position);
}
@Override
public {
position;
}
View {
ViewHolder holder;
(convertView == ) {
convertView = mInflater.inflate(R.layout.sd_card_item, );
holder = ();
holder.fileName = convertView.findViewById(R.id.filename);
holder.lastTime = convertView.findViewById(R.id.time);
holder.imageIcon = convertView.findViewById(R.id.image);
convertView.setTag(holder);
} {
holder = (ViewHolder) convertView.getTag();
}
mListFile.get(position);
item.getFileType();
R.drawable.none;
(.equals(type)) {
id = R.drawable.up1;
} (.equals(type)) {
id = R.drawable.sdcard0;
} (.equals(type)) {
id = R.drawable.folder2;
} (.equals(type)) {
id = R.drawable.other3;
} (.equals(type)) {
id = R.drawable.none;
}
holder.fileName.setText(item.getFileName());
holder.imageIcon.setImageBitmap(BitmapFactory.decodeResource(mContext.getResources(), id));
holder.lastTime.setText(item.getFileLastTime());
convertView;
}
{
TextView fileName;
TextView lastTime;
ImageView imageIcon;
}
}

