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

Android开发:如何向POST接口传递多选字符串数组?

如何将Android多选选中的选项传递给服务器并逐行插入数据库?

从提供的界面截图可见,应用包含可勾选的多选选项、药剂输入框和备注输入框,需求是点击提交按钮后,将所有勾选的选项发送至服务器,且服务器需在数据库中为每个选中选项插入一行记录。

你当前的代码仅能传递单个选项给服务器,要实现多选条目提交并匹配数据库逐行插入的需求,可按以下步骤改造:

一、先收集所有选中的选项

首先从你的多选组件(比如CheckBox列表、带多选功能的RecyclerView)中收集所有被勾选的条目,用集合存储:

// 示例:遍历CheckBox列表收集选中项
List<String> selectedPests = new ArrayList<>();
// 假设pestCheckBoxList是你页面上所有虫害选项的CheckBox集合
for (CheckBox checkBox : pestCheckBoxList) {
    if (checkBox.isChecked()) {
        selectedPests.add(checkBox.getText().toString());
    }
}

二、选择合适的提交方案

根据需求,有两种可行方案:

方案1:逐条发送请求(直接匹配数据库逐行插入的需求)

循环遍历选中的选项列表,逐个发起POST请求,每个请求对应数据库的一条记录:

// 批量提交方法,接收选中的虫害列表、药剂、备注
private void addScoutingBatch(List<String> selectedPests, final String chem, final String remarks) {
    pDialog.setMessage("正在添加记录...");
    showDialog();

    final int totalCount = selectedPests.size();
    final int[] completedCount = {0};

    for (final String pest : selectedPests) {
        StringRequest strReq = new StringRequest(Request.Method.POST,
                AppConfig.URL_ADDPLANTING, new Response.Listener<String>() {

            @Override
            public void onResponse(String response) {
                Log.d(TAG, "单条记录响应: " + response.toString());
                completedCount[0]++;
                handleBatchCompletion(totalCount, completedCount[0]);

                try {
                    JSONObject jObj = new JSONObject(response);
                    if (jObj.getBoolean("error")) {
                        Log.e(TAG, "添加失败: " + jObj.getString("error_msg"));
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e(TAG, "请求错误: " + error.getMessage());
                completedCount[0]++;
                handleBatchCompletion(totalCount, completedCount[0]);
            }
        }) {

            @Override
            protected Map<String, String> getParams() {
                Map<String, String> params = new HashMap<>();
                params.put("bcode", pest);
                params.put("chem", chem); // 传递药剂参数
                params.put("remarks", remarks); // 传递备注参数
                return params;
            }
        };

        AppController.getInstance().addToRequestQueue(strReq);
    }
}

// 处理批量请求完成后的逻辑
private void handleBatchCompletion(int total, int completed) {
    if (completed == total) {
        hideDialog();
        Toast.makeText(planting.this, "已完成所有记录提交", Toast.LENGTH_LONG).show();
    }
}

方案2:批量传递选项(减少请求次数,服务器端拆分插入)

将选中的选项打包成JSON数组传递给服务器,由服务器端解析后循环插入数据库:

// 批量提交方法,需引入Gson库(也可手动拼接JSON)
private void addScoutingBatch(List<String> selectedPests, final String chem, final String remarks) {
    pDialog.setMessage("正在添加记录...");
    showDialog();

    // 将选中列表转为JSON字符串
    String pestsJson = new Gson().toJson(selectedPests);

    StringRequest strReq = new StringRequest(Request.Method.POST,
            AppConfig.URL_ADDPLANTING, new Response.Listener<String>() {

        @Override
        public void onResponse(String response) {
            Log.d(TAG, "批量响应: " + response.toString());
            hideDialog();

            try {
                JSONObject jObj = new JSONObject(response);
                if (!jObj.getBoolean("error")) {
                    Toast.makeText(planting.this, "记录添加成功", Toast.LENGTH_LONG).show();
                } else {
                    Toast.makeText(planting.this, jObj.getString("error_msg"), Toast.LENGTH_LONG).show();
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }, new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {
            Log.e(TAG, "请求错误: " + error.getMessage());
            hideDialog();
        }
    }) {

        @Override
        protected Map<String, String> getParams() {
            Map<String, String> params = new HashMap<>();
            params.put("pests", pestsJson); // 传递批量选项的JSON
            params.put("chem", chem);
            params.put("remarks", remarks);
            return params;
        }
    };

    AppController.getInstance().addToRequestQueue(strReq);
}

三、注意事项

  • 确保应用已声明网络权限:<uses-permission android:name="android.permission.INTERNET"/>
  • 若选中条目数量较多,推荐方案2以减少网络请求开销
  • 可添加失败重试逻辑,避免因个别请求失败导致数据缺失
  • 弹窗需等待所有请求完成后再关闭,避免用户误解操作状态

内容的提问来源于stack exchange,提问作者Bored Ape

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 23:00:53