You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 10:00:02