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
相关产品推荐
相关产品推荐

