java - 将动态生成的表单的edittext数据保存到服务器
问题描述
我根据后端提供的json数据,根据类型即String、int和spinner生成了动态表单。
我创建了一个 recylerview 适配器,在 pojo 类中我添加了额外的变量作为答案,并为它提供了 setter 方法。
现在,表单已根据类型生成,但我需要将数据保存到服务器。为了保存数据,我需要使用各自的 id 和类型获取每个 edittext 值,我需要循环它,但我不能这样做。我无法使用其 ID 和类型定义 edittext 值。我希望你们能帮助我。
在方法 callRetrofitSaveForm() i 中有三个参数要发布到服务器。供应商 ID,ii。用户标识 iii. formData,我对 param iii 有疑问,因为它有要传递的格式。我已经使用改造来解析,问题在于第三个参数 formData。
第三个参数的值格式是
[{"id":"24","label":"Customer ID","value":"102"},{"id":"25","label":"Amount","value":"2000"}]
我的适配器
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
HelpForm.FormSetting formSetting=formArrayList.get(position);
final String description = formArrayList.get(position).getLabel();
Log.d("cjjdnjcnjd",description);
if (formSetting.getType().equals("STRING")){
Log.d("dndjkd",String.valueOf(holder.getAdapterPosition()));
holder.textViewString = new TextView(activity);
holder.linearLayout.addView(holder.textViewString);
holder.textViewString.setText(formSetting.getLabel());
holder.textViewString.setPadding(24, 4, 24, 2);
holder.textViewString.setTextColor(context.getResources().getColor(R.color.colorTexts));
holder.textViewString.setTextSize(15);
holder.editTextString = new EditText(activity);
holder.linearLayout.addView(holder.editTextString);
editTextListString.add(holder.editTextString);
}
if (formSetting.getType().equals("INT")){
holder.textViewInt = new TextView(activity);
holder.linearLayout.addView(holder.textViewInt);
holder.textViewInt.setText(formSetting.getLabel());
holder.textViewInt.setPadding(24, 4, 24, 2);
holder.textViewInt.setTextColor(context.getResources().getColor(R.color.colorTexts));
holder.textViewInt.setTextSize(15);
holder.editTextINT = new EditText(activity);
holder.linearLayout.addView(holder.editTextINT);
}
if (formSetting.getType().equals("DATE")){
holder.textViewDate = new TextView(activity);
holder.linearLayout.addView(holder.textViewDate);
holder.textViewDate.setText(formSetting.getLabel());
holder.textViewDate.setPadding(24, 4, 24, 2);
holder.textViewDate.setTextColor(context.getResources().getColor(R.color.colorTexts));
holder.textViewDate.setTextSize(15);
holder.editTextDate = new EditText(activity);
holder.linearLayout.addView(holder.editTextDate);
}
if(formSetting.getType().equals("DROPDOWN")){
holder.textViewSpinner = new TextView(context);
holder.linearLayout.addView(holder.textViewSpinner);
holder.textViewSpinner.setText(formSetting.getLabel());
holder.textViewSpinner.setPadding(16, 4, 8, 4);
holder.spinner = new Spinner(context);
holder.linearLayout.addView(holder.spinner);
ArrayList<String> err = new ArrayList<>();
err = formSetting.getOptions();
holder.spinner.setAdapter(new ArrayAdapter<String>(context, android.R.layout.simple_dropdown_item_1line, err));
}
VendorFormActivity.save.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
callRetrofitSaveForm();
}
});
}
@Override
public int getItemCount() {
return formArrayList.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder {
TextView textViewString,textViewInt,textViewDate;
LinearLayout linearLayout;
EditText editTextString,editTextINT,editTextDate;
Spinner spinner;
TextView textViewSpinner;
public MyViewHolder(View itemView) {
super(itemView);
linearLayout=itemView.findViewById(R.id.dynamiccontainer);
}
}
JSON 响应
{
"status": "200",
"message": "success",
"formSetting": [
{
"label": "Customer ID",
"id": 24,
"type": "INT"
},
{
"label": "Amount",
"id": 25,
"type": "INT"
}
]
}
帮助表格
public class HelpForm {
@SerializedName("status")
@Expose
public String status;
@SerializedName("message")
@Expose
public String message;
@SerializedName("formSetting")
@Expose
public ArrayList<FormSetting> formSetting = null;
public ArrayList<FormSetting> getFormSetting() {
return formSetting;
}
public String getStatus() {
return status;
}
public String getMessage() {
return message;
}
public class FormSetting {
@SerializedName("options")
@Expose
public ArrayList<String> options = null;
@SerializedName("label")
@Expose
public String label;
@SerializedName("id")
@Expose
public String id;
@SerializedName("type")
@Expose
public String type;
@SerializedName("answer")
@Expose
public String answer;
public ArrayList<String> getOptions() {
return options;
}
public String getLabel() {
return label;
}
public String getId() {
return id;
}
public String getType() {
return type;
}
public void setAnswer(String answer) {
this.answer = answer;
}
}
}
public void callRetrofitSaveForm() {
RestClient.RetroInterfaceAPI mInterface = RestClient.getClient();
Call<SaveForm> call = mInterface.getSaveForm( vendorID, userID,formData);
call.enqueue(new Callback<SaveForm>() {
@Override
public void onResponse(Call<SaveForm> call, Response<SaveForm> response) {
if (response.body() != null) {
}
}
@Override
public void onFailure(Call<SaveForm> call, Throwable t) {
}
});
}
}
解决方案
您可以抓取父视图并循环遍历它并获取所有editText。
private HashSet<EditText> getTextViews(ViewGroup root){
HashSet<EditText> views=new HashSet<>();
for(int i=0;i<root.getChildCount();i++){
View v=root.getChildAt(i);
if(v instanceof EditText){
views.add((EditText)v);
}else if(v instanceof ViewGroup){
views.addAll(getTextViews((ViewGroup)v));
}
}
return views;
}
推荐阅读
- node.js - NodeJS MongoDB populate() 带来字符串而不是 JSON
- ansible - 在检查 Ansible 中的主机是否可访问时,dict object' 没有属性 'ansible_facts'
- python - 如何在深度未知的深度嵌套字典中删除空字段或无字段?
- python - 如何在TensorFlow中同时将一层并行传入两层
- scala - 在scala中,协变类型参数怎么可能是抽象类型的上限,而不是另一个不变类型参数?
- python - 如何使用 Selenium 和 Pyhton 在 iframe 中单击弹出窗口按钮
- mysql - SQL - 通过用户本身 - 或 - 他的组从多对多关系中获取记录
- java - 404状态返回请求
- c# - 使用 c# 客户端发送但未收到的电子邮件?
- variables - 如何使用变量拆分基于 kotlin 的大型 Gradle 构建文件?