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

Android GridView + SimpleAdapter 顯示同一張圖?Map 復用導致數據覆蓋

     編輯:程式設計綜合問答

現象:GridView 本想顯示 a1、a2、a3 三張圖,結果全是 a3。代碼核心片段:

Map map = new HashMap<>();
map.put("圖片", R.drawable.a1); list.add(map);
map.put("圖片", R.drawable.a2); list.add(map); // 同一 map 對象!
map.put("圖片", R.drawable.a3); list.add(map);

根本原因

list 中添加的是同一個 Map 對象的引用。後兩次 put 覆蓋了同一個 key,最終 list 裡三個引用指向同一個 Map,值都是最後一次 put 的 a3。SimpleAdapter 讀取時自然全顯示 a3。

正確寫法:每條數據 new 一個 Map

List> list = new ArrayList<>();

Map map1 = new HashMap<>();
map1.put("image", R.drawable.a1);
list.add(map1);

Map map2 = new HashMap<>();
map2.put("image", R.drawable.a2);
list.add(map2);

Map map3 = new HashMap<>();
map3.put("image", R.drawable.a3);
list.add(map3);

SimpleAdapter adapter = new SimpleAdapter(
    this, list, R.layout.imageview,
    new String[]{"image"}, new int[]{R.id.image}
);
gridView.setAdapter(adapter);

進階:用 Java Bean 替代 Map,類型安全、可讀性強

public class ImageItem {
    private int resId;
    public ImageItem(int resId) { this.resId = resId; }
    public int getResId() { return resId; }
}

// 構建數據
List data = Arrays.asList(
    new ImageItem(R.drawable.a1),
    new ImageItem(R.drawable.a2),
    new ImageItem(R.drawable.a3)
);

// 自定義 BaseAdapter 綁定
// 或用 RecyclerView + ViewHolder 更現代

避坑清單

  1. 集合添加對象時,每條數據 new 新對象,除非故意共享引用。
  2. SimpleAdapter 的 from 數組 key 必須與 Map key 完全一致(區分大小寫)。
  3. to 數組對應布局文件中的 View id,類型為 int[] 而非 Integer[]。
  4. 圖片資源用 R.drawable.xxx (int),不要用 "R.drawable.xxx" (String)。

記住:List 裡存的是引用,Map 是可變對象,循環復用同一 Map 等於自我覆蓋,這是 Java 集合框架最經典的淺拷貝坑。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved