開發者在使用 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 更靈活。這是一個極其常見的「引用陷阱」,不僅限於 Android,Java 所有集合操作都需注意:**循環添加對象時,必須在循環內部實例化新對象**。