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

Android ListView 無法獲取手機音樂信息?常見錯誤:循環中重複添加同一對象

     編輯:程式設計綜合問答

問題現象

開發者在使用 ListView 展示手機本地音樂時,發現雖然代碼邏輯看似正確,但列表顯示異常或數據全為最後一條。附帶截圖顯示代碼結構與運行結果。

核心錯誤分析

經典低級錯誤:在循環外 new 對象,導致列表中存入的全是同一個對象引用。

// 錯誤示範
MusicInfo info = new MusicInfo(); // 循環外創建
for (Cursor c : cursor) {
    info.setTitle(c.getString(...));
    info.setArtist(c.getString(...));
    list.add(info); // 每次添加的都是同一個 info
}

結果:列表大小雖然正確,但每一項指向的都是同一個對象,最終顯示的全是最後一次賦值的數據。

正確寫法

// 正確示範
for (Cursor c : cursor) {
    MusicInfo info = new MusicInfo(); // 循環內創建,每次新對象
    info.setTitle(c.getString(...));
    info.setArtist(c.getString(...));
    list.add(info);
}

補充建議

  • 使用 MediaStore 查詢音樂時,記得在 AndroidManifest.xml 聲明 READ_EXTERNAL_STORAGE 權限,並在 Android 6.0+ 動態申請。
  • 考慮使用 RecyclerView 替代 ListView,性能更優、API 更靈活。
  • 大量數據時建議採用分頁加載或異步載入,避免阻塞主線程導致 ANR。

總結

這是一個極其常見的「引用陷阱」,不僅限於 Android,Java 所有集合操作都需注意:**循環添加對象時,必須在循環內部實例化新對象**。

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