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

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);
        });
    }
}

扩展说明

后续新增检测项时,只需要三步:

  1. 在布局里按现有规则添加新的OK、NOT OK按钮,ID按序号顺延为ok_3/nok_3这类格式
  2. 把TOTAL_ITEM_COUNT的值改成新的检测项总数
  3. 在字段映射的switch块里添加新检测项对应的数据表字段名
    核心的循环和判断逻辑不需要做任何修改。

内容的提问来源于stack exchange,提问作者Syed Atif

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 23:51:13