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

如何从ListView获取更新后的值并回传至服务器(Android)

解决ListView中EditText修改后数据无法同步到服务器的问题

我看了你的代码,核心问题是你只把数据展示到了EditText里,但没有监听用户对EditText的修改,也就没把更新后的值同步回你的数据源leaveStaEndDTOList。当你准备提交的时候,数据源里还是原来的旧数据,自然无法把修改后的内容发给服务器。

下面是具体的修复步骤和修改后的代码:

1. 优化适配器,添加EditText文本监听

首先给适配器添加ViewHolder模式(提升列表性能),同时给每个EditText设置TextWatcher,实时把用户输入的内容更新到对应的LeaveStaEndDTO对象中:

public class AdapterLeaveDateCalenderItem extends BaseAdapter {
    private Context context;
    private List<LeaveStaEndDTO> leaveStaEndDTOS33;

    public AdapterLeaveDateCalenderItem(Context context, List<LeaveStaEndDTO> leaveStaEndDTOS) {
        this.context = context;
        this.leaveStaEndDTOS33 = leaveStaEndDTOS;
    }

    @Override
    public int getCount() {
        return leaveStaEndDTOS33.size();
    }

    @Override
    public Object getItem(int position) {
        return leaveStaEndDTOS33.get(position);
    }

    @Override
    public long getItemId(int position) {
        return leaveStaEndDTOS33.get(position).getMonth();
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.leave_fragment_calender_item, parent, false);
            holder = new ViewHolder();
            holder.dateTv = convertView.findViewById(R.id.dateGetLeave);
            holder.morningEt = convertView.findViewById(R.id.morningGetLeave);
            holder.afternoonEt = convertView.findViewById(R.id.afternoonGetLeave);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        final LeaveStaEndDTO leaveStaEndDTO33 = leaveStaEndDTOS33.get(position);
        holder.dateTv.setText(String.valueOf(leaveStaEndDTO33.getDate()));
        holder.morningEt.setText(String.valueOf(leaveStaEndDTO33.getMorningValue()));
        holder.afternoonEt.setText(String.valueOf(leaveStaEndDTO33.getAfternoonValue()));

        // 监听上午EditText的变化,实时更新数据源
        holder.morningEt.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {}

            @Override
            public void afterTextChanged(Editable s) {
                try {
                    // 把输入的字符串转成int,更新到对象中
                    int value = Integer.parseInt(s.toString().trim());
                    leaveStaEndDTO33.setMorningValue(value);
                } catch (NumberFormatException e) {
                    // 如果输入不是数字,设置默认值或者提示用户
                    leaveStaEndDTO33.setMorningValue(0);
                }
            }
        });

        // 监听下午EditText的变化,实时更新数据源
        holder.afternoonEt.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {}

            @Override
            public void afterTextChanged(Editable s) {
                try {
                    int value = Integer.parseInt(s.toString().trim());
                    leaveStaEndDTO33.setAfternoonValue(value);
                } catch (NumberFormatException e) {
                    leaveStaEndDTO33.setAfternoonValue(0);
                }
            }
        });

        return convertView;
    }

    // ViewHolder类,避免重复findViewById
    private static class ViewHolder {
        TextView dateTv;
        EditText morningEt;
        EditText afternoonEt;
    }
}

2. 实现提交按钮的逻辑,把更新后的数据发送到服务器

现在你的submitLeaveNew按钮点击事件是空的,我们需要在这里把leaveStaEndDTOList里的所有数据(已经被EditText的监听器更新过)转换成JSON,然后用Volley发送到服务器:

submitLeaveNew.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // 1. 把leaveStaEndDTOList转换成JSON数组
        JSONArray jsonArray = new JSONArray();
        for (LeaveStaEndDTO dto : leaveStaEndDTOList) {
            JSONObject jsonObject = new JSONObject();
            try {
                jsonObject.put("id", dto.getId());
                jsonObject.put("morningValue", dto.getMorningValue());
                jsonObject.put("afternoonValue", dto.getAfternoonValue());
                jsonObject.put("weekend", dto.getWeekend());
                jsonObject.put("year", dto.getYear());
                jsonObject.put("month", dto.getMonth());
                jsonObject.put("day", dto.getDay());
                jsonObject.put("dayCode", dto.getDayCode());
                jsonObject.put("date", dto.getDate());
                jsonArray.put(jsonObject);
            } catch (JSONException e) {
                e.printStackTrace();
                Toast.makeText(getContext(), "数据转换失败", Toast.LENGTH_SHORT).show();
                return;
            }
        }

        // 2. 发送POST请求到服务器
        final ProgressDialog progress = new ProgressDialog(getContext());
        progress.setTitle("提交数据");
        progress.setMessage("正在提交...");
        progress.setCancelable(false);
        progress.show();

        String submitUrl = "你的提交接口URL"; // 替换成实际的服务器提交地址
        StringRequest stringRequest = new StringRequest(Request.Method.POST, submitUrl,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        progress.dismiss();
                        Toast.makeText(getContext(), "提交成功", Toast.LENGTH_SHORT).show();
                        // 提交成功后的逻辑,比如刷新页面或者返回
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        progress.dismiss();
                        Toast.makeText(getContext(), "提交失败: " + error.getMessage(), Toast.LENGTH_SHORT).show();
                    }
                }) {
            @Override
            public String getBodyContentType() {
                return "application/json; charset=utf-8";
            }

            @Override
            public byte[] getBody() throws AuthFailureError {
                return jsonArray.toString().getBytes(StandardCharsets.UTF_8);
            }

            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                Map<String, String> headers = new HashMap<>();
                headers.put("Accept", "application/json");
                headers.put("Authorization", utils.bear + utils.user_token);
                return headers;
            }
        };

        RequestQueue requestQueue = Volley.newRequestQueue(getContext());
        requestQueue.add(stringRequest);
    }
});

3. 额外的优化建议

  • 可以给EditText设置输入类型为数字,避免用户输入非数字内容:在XML的EditText里添加android:inputType="number"
  • 如果你的leaveStaEndDTOList是从服务器获取的,确保每个LeaveStaEndDTO对象都有正确的id,这样服务器才能识别要更新的是哪条数据
  • 提交前可以做数据校验,比如检查EditText是否为空或者输入是否合法

内容的提问来源于stack exchange,提问作者Mughira Dar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 11:02:29