如何从android listview中的json动态创建视图?

时间:2015-05-28 03:06:37

标签: android json android-view

我想从Web服务动态创建单选按钮,复选框,微调器。以下是我的回复。

{
    "getSurvey": {
        "ErrorCode": "0",
        "Result": "Success",
        "Response": [
            {
                "SurveyId": "91",
                "SurveyName": "Sample Survey",
                "Questions": [
                    {
                        "QuestionId": "553",
                        "QuestionText": "<p style=\"margin: 0px; text-align: left;\">Are you satisfied with Cement Quality?</p>",
                        "Type": "RadioButtonList",
                        "Mandatory": "Y",
                        "OptionValue": [
                            {
                                "AnswerId": "2220",
                                "AnswerValue": "Excellent"
                            },
                            {
                                "AnswerId": "2221",
                                "AnswerValue": "Good"
                            },
                            {
                                "AnswerId": "2222",
                                "AnswerValue": "Satisfactory"
                            },
                            {
                                "AnswerId": "2223",
                                "AnswerValue": "Poor"
                            }
                        ]
                    },
                    {
                        "QuestionId": "554",
                        "QuestionText": "How will you rate Cement? (0= Lowest and 7= Highest)&nbsp;",
                        "Type": "DropDownList",
                        "Mandatory": "Y",
                        "OptionValue": [
                            {
                                "AnswerId": "2224",
                                "AnswerValue": "0"
                            },
                            {
                                "AnswerId": "2225",
                                "AnswerValue": "1"
                            },
                            {
                                "AnswerId": "2226",
                                "AnswerValue": "2"
                            },
                            {
                                "AnswerId": "2227",
                                "AnswerValue": "3"
                            },
                            {
                                "AnswerId": "2228",
                                "AnswerValue": "4"
                            },
                            {
                                "AnswerId": "2229",
                                "AnswerValue": "5"
                            },
                            {
                                "AnswerId": "2230",
                                "AnswerValue": "6"
                            },
                            {
                                "AnswerId": "2231",
                                "AnswerValue": "7"
                            }
                        ]
                    },
                    {
                        "QuestionId": "555",
                        "QuestionText": "What Kind of issues you face while Delivery?",
                        "Type": "ListBox",
                        "Mandatory": "Y",
                        "OptionValue": [
                            {
                                "AnswerId": "2232",
                                "AnswerValue": "Logistic Issue"
                            },
                            {
                                "AnswerId": "2233",
                                "AnswerValue": "Material Handeling "
                            },
                            {
                                "AnswerId": "2234",
                                "AnswerValue": "Stock not available"
                            },
                            {
                                "AnswerId": "2235",
                                "AnswerValue": "Wastage of Cement"
                            },
                            {
                                "AnswerId": "2236",
                                "AnswerValue": "Others"
                            }
                        ]
                    },
                    {
                        "QuestionId": "559",
                        "QuestionText": "Do you like Cement?",
                        "Type": "CheckBoxList",
                        "Mandatory": "Y",
                        "OptionValue": [
                            {
                                "AnswerId": "2237",
                                "AnswerValue": "Yes"
                            },
                            {
                                "AnswerId": "2238",
                                "AnswerValue": "No"
                            }
                        ]
                    }
                ]
            }
        ]
    }
} 

基于类型我需要动态创建视图。请有人给我一个想法或解决方案如何实现这一目标。动态创建视图后,我需要从创建的视图中获取所有选定的值。

感谢。

5 个答案:

答案 0 :(得分:7)

您可以使用json2view库来动态创建视图。

https://github.com/Avocarrot/json2view

答案 1 :(得分:3)

这很棘手,您需要先学习如何在代码中动态创建布局。我将从这里找到的审阅教程开始:http://www.dreamincode.net/forums/topic/130521-android-part-iii-dynamic-layouts/

您需要创建一个可以解析此数据的类,并专门为您的值创建视图。完成后,您可以再次读取数据或将其存储,以便将数据加载到屏幕上。这也可以在您创建布局的同时完成。

答案 2 :(得分:0)

如果事先知道'"Type": "RadioButtonList"'之类的问题类型,则可以创建针对每种类型的预定义布局。然后,您需要解析并查找json中的对象/ Response / Questions / Type并扩展相应的布局。您还需要创建一个可以接受每种类型的选项列表的适配器。插入适配器和布局后面的视图。

我为我工作的产品做了类似的事情。在检索json feed之后,我将浏览问题以查看我需要的布局类型。在我的场景中,我动态创建了一个ViewPager:每个进入视图寻呼机的条目都有一个与问题类型相对应的布局。然后,我将为每个问题类型构建选项列表,并将它们提供给绑定到listview或下拉列表的适配器或驻留在布局文件中的自定义类型。

答案 3 :(得分:0)

只需解析并将数据设置为代码中的静态数据

ScrollView sv = new ScrollView(this);
    LinearLayout ll = new LinearLayout(this);
    ll.setOrientation(LinearLayout.VERTICAL);
    sv.addView(ll);


    //radio list
    RadioGroup group = new RadioGroup(this); 
    group.setOrientation(RadioGroup.VERTICAL);

    RadioButton btn1 = new RadioButton(this);
    btn1.setText("BTN1");
    group.addView(btn1);

    RadioButton btn2 = new RadioButton(this);
    btn2.setText("BTN2");
    group.addView(btn2);

    ll.addView(group);


    //drop down
    Spinner spiner = new Spinner(this);
    List<String> data = new ArrayList<String>();
    data.add("Spinner - one");
    data.add("Spinner - two");
    data.add("Spinner - three");
    data.add("Spinner - four");
    data.add("Spinner - five");

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, data);
    spiner.setAdapter(adapter);

    ll.addView(spiner);

    //listview
    ListView listData = new ListView(this);
    List<String> dataList = new ArrayList<String>();
    dataList.add("List - one");
    dataList.add("List - two");
    dataList.add("List - three");
    dataList.add("List - four");
    dataList.add("List - five");
    dataList.add("List - six");
    dataList.add("List - seven");
    dataList.add("List - eight");
    dataList.add("List - nine");
    dataList.add("List - ten");
    dataList.add("List - eleven");
    dataList.add("List - twelve");
    dataList.add("List - thirteen");
    dataList.add("List - fourteen");
    dataList.add("List - fifteen");
    ArrayAdapter<String> listAdapter = new ArrayAdapter<String>(this,    
    android.R.layout.simple_list_item_1, dataList);
    listData.setAdapter(listAdapter);

    ll.addView(listData);
    this.setContentView(sv);

    setListViewHeightBasedOnChildren(listData);

支持方法

public static void setListViewHeightBasedOnChildren(ListView listView) {
    ListAdapter listAdapter = listView.getAdapter(); 
    if (listAdapter == null) {
        // pre-condition
        return;
    }

    int totalHeight = 0;
    for (int i = 0; i < listAdapter.getCount(); i++) {
        View listItem = listAdapter.getView(i, null, listView);
        listItem.measure(0, 0);
        totalHeight += listItem.getMeasuredHeight();
    }

    ViewGroup.LayoutParams params = listView.getLayoutParams();
    params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
    listView.setLayoutParams(params);
    listView.requestLayout();
}

答案 4 :(得分:0)

试试这个。希望它可以帮助你。

public class MainActivity extends Activity {
	String response = "";

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		try {
			JSONObject jObject1 = new JSONObject(response);
			JSONObject jObject2 = jObject1.getJSONObject("getSurvey");
			if (jObject2.getString("ErrorCode").equals("0")) {
				JSONArray jArray = jObject2.getJSONArray("Response");
				JSONObject jObject3 = jArray.getJSONObject(0);// Response array
																// contains only
																// one object ,
																// otherwise we
																// can put loop
				JSONArray jArray2 = jObject3.getJSONArray("Questions");
				for (int i = 0; i < jArray2.length(); i++) {

					JSONObject jObjectQ = jArray2.getJSONObject(i);
					String QUESTION = jObjectQ.getString("QuestionText"); // Similarly
																			// you
																			// can
																			// take
																			// other
																			// parameters.
					JSONArray jArrayA = jObjectQ.getJSONArray("OptionValue");
					for (int j = 0; j < jArrayA.length(); j++) {
						JSONObject jObjectOPTION = jArrayA.getJSONObject(j);
						String ANSWERID = jObjectOPTION.getString("AnswerId");
						String ANSWERVALUE = jObjectOPTION
								.getString("AnswerValue");

						// Add Dynamically in Spinner or create Radiobutton as
						// per your requirement
					}

				}

			}

		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
}

您还可以动态设置每个控件的Id。基于此,您应该调用任何方法并检查控件的ID。