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

