我想从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) ",
"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"
}
]
}
]
}
]
}
}
基于类型我需要动态创建视图。请有人给我一个想法或解决方案如何实现这一目标。动态创建视图后,我需要从创建的视图中获取所有选定的值。
感谢。
答案 0 :(得分:7)
您可以使用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。