Android Studio实现排除NOT OK项的全选按钮与SQL入库逻辑
Android车辆检测页全选OK功能实现方案
前置准备
你现有布局里的检测项按钮已经按ok_序号/nok_序号的规则命名,只需要先在表头区域新增一个全选按钮,id设为@+id/select_all_ok即可,不需要改动现有检测项的布局结构。
核心逻辑不要依赖按钮样式判断状态,单独维护一份检测项状态映射,避免后续调整按钮样式时逻辑失效。
实现逻辑
- 初始化阶段通过循环批量绑定所有检测项的OK、NOT OK按钮点击事件,同步维护每个检测项的状态:
0=NOT OK、1=OK、-1=未选择 - 点击全选按钮时,循环遍历所有检测项,通过条件判断直接跳过已经标记为NOT OK的项,剩余项统一设置为OK状态、更新按钮样式
- 所有状态更新完成后,批量拼接数据库写入参数,一次性执行SQL写入,避免多次操作数据库
核心代码
public class InspectionActivity extends AppCompatActivity { // 总检测项数量,后续新增检测项只需要修改这个值 private final int TOTAL_ITEM_COUNT = 2; // 存储检测项状态:-1未选 / 1OK / 0NOT OK private final SparseArray<Integer> itemStatus = new SparseArray<>(); // 存储按钮实例映射 private final SparseArray<Button> okBtnMap = new SparseArray<>(); private final SparseArray<Button> nokBtnMap = new SparseArray<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_inspection); // 循环初始化所有检测项 for (int i = 1; i <= TOTAL_ITEM_COUNT; i++) { // 按ID命名规则动态获取按钮实例,不需要逐个findViewById int okResId = getResources().getIdentifier("ok_" + i, "id", getPackageName()); int nokResId = getResources().getIdentifier("nok_" + i, "id", getPackageName()); Button okBtn = findViewById(okResId); Button nokBtn = findViewById(nokResId); okBtnMap.put(i, okBtn); nokBtnMap.put(i, nokBtn); itemStatus.put(i, -1); // 绑定OK按钮点击事件 okBtn.setOnClickListener(v -> { itemStatus.put(i, 1); okBtn.setBackgroundTintList(ColorStateList.valueOf(Color.GREEN)); nokBtn.setBackgroundTintList(ColorStateList.valueOf(Color.parseColor("#807C7C"))); }); // 绑定NOT OK按钮点击事件 nokBtn.setOnClickListener(v -> { itemStatus.put(i, 0); nokBtn.setBackgroundTintList(ColorStateList.valueOf(Color.RED)); okBtn.setBackgroundTintList(ColorStateList.valueOf(Color.parseColor("#807C7C"))); }); } // 全选按钮逻辑 Button selectAllOkBtn = findViewById(R.id.select_all_ok); selectAllOkBtn.setOnClickListener(v -> { // 第一轮循环:更新UI和状态,跳过已标记NOT OK的项 for (int i = 1; i <= TOTAL_ITEM_COUNT; i++) { // 条件判断:已标记NOT OK直接跳过 if (itemStatus.get(i) == 0) { continue; } // 其余项统一设为OK itemStatus.put(i, 1); okBtnMap.get(i).setBackgroundTintList(ColorStateList.valueOf(Color.GREEN)); nokBtnMap.get(i).setBackgroundTintList(ColorStateList.valueOf(Color.parseColor("#807C7C"))); } // 第二轮循环:批量拼接数据库写入参数 ContentValues dbValues = new ContentValues(); for (int i = 1; i <= TOTAL_ITEM_COUNT; i++) { // 按序号映射对应的数据表字段,新增检测项在这里补充映射即可 String columnName = switch (i) { case 1 -> "serial_number_punching_check"; case 2 -> "boat_tightening_check"; default -> ""; }; dbValues.put(columnName, itemStatus.get(i)); } // 执行数据库写入,替换成你自己的数据库操作逻辑即可 // SQLiteDatabase db = dbHelper.getWritableDatabase(); // db.insert("vehicle_inspection_record", null, dbValues); }); } }
扩展说明
后续新增检测项时,只需要三步:
- 在布局里按现有规则添加新的OK、NOT OK按钮,ID按序号顺延为
ok_3/nok_3这类格式 - 把
TOTAL_ITEM_COUNT的值改成新的检测项总数 - 在字段映射的switch块里添加新检测项对应的数据表字段名
核心的循环和判断逻辑不需要做任何修改。
内容的提问来源于stack exchange,提问作者Syed Atif
相关产品推荐
相关产品推荐

