首页 > 解决方案 > 将动态生成的表单的edittext数据保存到服务器

问题描述

我根据后端提供的json数据,根据类型即String、int和spinner生成了动态表单。

  1. 我创建了一个 recylerview 适配器,在 pojo 类中我添加了额外的变量作为答案,并为它提供了 setter 方法。

  2. 现在,表单已根据类型生成,但我需要将数据保存到服务器。为了保存数据,我需要使用各自的 id 和类型获取每个 edittext 值,我需要循环它,但我不能这样做。我无法使用其 ID 和类型定义 edittext 值。我希望你们能帮助我。

  3. 在方法 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) {

                }
            });
        }

    }

标签: javaandroidretrofit

解决方案


您可以抓取父视图并循环遍历它并获取所有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;
}

推荐阅读