【问题标题】:Save the edittext data of a dynamic generated forms to server将动态生成的表单的edittext数据保存到服务器
【发布时间】:2018-10-24 06:17:21
【问题描述】:

我已经根据后端提供的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) {

                }
            });
        }

    }

【问题讨论】:

  • 你的意思是你的 3 参数没有设置?
  • 看到您的问题后,您需要先将值放入JSONArray 并将其作为JsonStringer 发送,或者您可以将JSONArray 转换为Gson 并转换为String 并传递一个字符串类型字段。您也可以在Body 标签中传递它。
  • 你能把例子贴在这里怎么做。
  • 可以查看this
  • 我试过了,但我只得到了最后一个编辑文本的值。

标签: java android retrofit


【解决方案1】:

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

【讨论】:

  • 你能给我提供完整的例子吗?
猜你喜欢
  • 1970-01-01
  • 2017-04-13
  • 2019-02-27
  • 2014-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-11
  • 2011-05-01
相关资源
最近更新 更多