Android使用Cursor查询存储音轨仅返回1条数据问题求助
问题根因
- 核心错误:
arrayList初始化位置错误,你把arrayList = new ArrayList<CustomListView>();写在了do-while循环内部,每遍历到一条音轨就会重新创建一个空的ArrayList,之前添加的所有数据都会被清空,最终只会保留最后一次循环添加的1条数据,所以ArrayList大小始终为1。 - 冗余逻辑问题:Adapter初始化、绑定ListView、设置条目点击事件的逻辑也放在了循环内部,会重复创建Adapter实例,额外占用系统资源,没有实际意义。
- 优化遗漏点:Cursor使用完后没有调用
close()方法释放资源,会造成内存泄漏。
修复后代码
private void Encrypt() { Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; Cursor cursor = getContentResolver().query(uri, null, null, null, null); // ArrayList初始化放在循环外部,全局复用 arrayList = new ArrayList<CustomListView>(); if(cursor!= null && cursor.moveToFirst()){ int TrackTitle = cursor.getColumnIndex(MediaStore.Audio.Media.TITLE); int Artist = cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST); int Path = cursor.getColumnIndex(MediaStore.Audio.Media.DATA); do{ String Tracktitle = cursor.getString(TrackTitle); String Trackartist = cursor.getString(Artist); String Trackpath = cursor.getString(Path); // 直接向已初始化的ArrayList中添加数据 arrayList.add(new CustomListView(R.drawable.none, Tracktitle, Trackartist, Trackpath)); }while (cursor.moveToNext()); // 用完Cursor及时释放资源 cursor.close(); } // 所有数据加载完成后再统一绑定Adapter和点击事件 CustomListViewAdapter customListViewAdapter = new CustomListViewAdapter(this, arrayList); tracks.setAdapter(customListViewAdapter); tracks.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // 后续点击逻辑在此处编写 } }); }
内容的提问来源于stack exchange,提问作者Khaby Lame
相关产品推荐
相关产品推荐

