首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android ListView 綁定 JSON 解析資料含圖片:Adapter 中非同步載入圖片最佳實務

     編輯:程式設計綜合問答

架構概覽

  1. 解析 JSON → 資料模型 List(含圖片 URL 字串)。
  2. 自訂 BaseAdapter 或 ArrayAdapter,getView 中使用圖片載入庫(Glide/Picasso/Coil)非同步載入。
  3. 利用 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 實現無限滾動。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved