架構概覽
- 解析 JSON → 資料模型 List(含圖片 URL 字串)。
- 自訂
BaseAdapter 或 ArrayAdapter,getView 中使用圖片載入庫(Glide/Picasso/Coil)非同步載入。
- 利用
ViewHolder 模式複用視圖,避免重複 findViewById。
資料模型
public class NewsItem {
public String title;
public String type;
public String imageUrl; // 圖片網址
}
Adapter 實作
public class NewsAdapter extends BaseAdapter {
private final Context context;
private final List<NewsItem> items;
public NewsAdapter(Context context, List<NewsItem> items) {
this.context = context;
this.items = items;
}
@Override public int getCount() { return items.size(); }
@Override public NewsItem getItem(int pos) { return items.get(pos); }
@Override public long getItemId(int pos) { return pos; }
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.list_item_news, parent, false);
holder = new ViewHolder();
holder.title = convertView.findViewById(R.id.tv_title);
holder.type = convertView.findViewById(R.id.tv_type);
holder.image = convertView.findViewById(R.id.iv_image);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
NewsItem item = getItem(position);
holder.title.setText(item.title);
holder.type.setText(item.type);
// 使用 Glide 載入圖片(自動快取、佔位圖、錯誤圖)
Glide.with(context)
.load(item.imageUrl)
.placeholder(R.drawable.ic_placeholder)
.error(R.drawable.ic_error)
.into(holder.image);
return convertView;
}
static class ViewHolder {
TextView title, type;
ImageView image;
}
}
JSON 解析通用方法
public List<NewsItem> parseJson(String jsonStr) throws JSONException {
List<NewsItem> list = new ArrayList<>();
JSONArray array = new JSONArray(jsonStr);
for (int i = 0; i < array.length(); i++) {
JSONObject obj = array.getJSONObject(i);
NewsItem item = new NewsItem();
item.title = obj.optString("title");
item.type = obj.optString("type");
item.imageUrl = obj.optString("image_url");
list.add(item);
}
return list;
}
關鍵優勢
- 圖片載入庫處理:記憶體快取、磁碟快取、生命週期綁定、預設圖、轉換動畫。
- 分離關注點:解析邏輯與 UI 渲染分離,易於測試與維護。
- 支援分頁:配合
RecyclerView + PagingSource 實現無限滾動。