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

Android技术问题:避免点击按钮时MultiChoiceItems对话框重复加载MySQL数据

嘿,这个问题我之前也碰到过!核心原因很简单——你每次点击按钮触发逻辑时,mWorkoutNames这个ArrayList并没有被清空,旧数据一直留在里面,新查询出来的数据又追加进去,自然就重复了。下面是具体的解决办法:

解决步骤

1. 每次查询前清空列表

在调用数据库查询方法之前,先把存储数据的mWorkoutNames清空,确保每次都是从空列表开始加载最新数据:

// 关键:先清空已有数据,避免重复追加
mWorkoutNames.clear();
Cursor data = mDatabaseHelper.getWorkoutNames();

2. 安全处理Cursor,避免内存泄漏

Cursor是Android的资源对象,用完必须关闭,不然会导致内存泄漏。推荐用try-with-resources语法,它会自动帮你管理Cursor的生命周期,不用手动写close():

mWorkoutNames.clear();
// try-with-resources 自动关闭Cursor,更安全
try (Cursor data = mDatabaseHelper.getWorkoutNames()) {
    if (data != null && data.moveToFirst()) {
        do {
            String workoutNameTobeAddded = data.getString(0);
            mWorkoutNames.add(workoutNameTobeAddded);
        } while (data.moveToNext());
    }
    // 转换为字符串数组
    workoutNameList = mWorkoutNames.toArray(new String[mWorkoutNames.size()]);
} catch (Exception e) {
    e.printStackTrace();
}

3. 确保对话框使用最新数据

如果你的对话框是提前创建好的实例,记得每次更新数据后重新设置多选选项;更稳妥的方式是每次点击按钮时,基于最新的workoutNameList创建新的对话框实例,这样绝对能拿到最新数据:

if (workoutNameList.length == 0) {
    // 提示创建训练项
    Toast.makeText(this, "请先创建训练项", Toast.LENGTH_SHORT).show();
} else {
    // 每次都生成新的对话框,用最新的数组
    new AlertDialog.Builder(this)
            .setTitle("选择训练项")
            .setMultiChoiceItems(workoutNameList, null, (dialog, which, isChecked) -> {
                // 你的多选逻辑
            })
            .setPositiveButton("确定", (dialog, which) -> {
                // 确定按钮逻辑
            })
            .show();
}

这样修改后,每次点击按钮都会先清空旧数据、查询数据库最新内容、生成新的选项数组,既不会重复显示旧数据,也能及时加载新增的训练名称。

内容的提问来源于stack exchange,提问作者Lenny Kiano

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:54:29