如何在线性布局中添加jsonarray响应?

时间:2014-10-21 10:29:50

标签: java android

我得到一个json响应,其中我得到jsonObject和jsonArray。我成功地为jsonObject设置了值,但对于JsonArray,我有两个值作为que ans ans。例如:

 "question": [
            {
                "ans": "test",
                "que": "What is your name"
            },
            {
                "ans": "25-30",
                "que": "Age"
            }
        ]

这是jsonObject中的jsonarray。现在我想在文本框中设置que和ans。请注意,问题的数量不是固定的,它们可以是12或更多,取决于API。

我的问题是如何在布局inflater或类似的东西中设置这个问题? 提前谢谢:)

2 个答案:

答案 0 :(得分:0)

请尝试这种方式,希望这有助于您解决问题。

<强> activity_main.xml中

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:id="@+id/lnrQuestionContainer"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

    </LinearLayout>
</ScrollView>

<强> question.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/txtQuestion"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <TextView
        android:id="@+id/txtAnswer"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"/>

</LinearLayout>

<强> MainActivity.java

public class MainActivity extends ActionBarActivity {

    private LinearLayout lnrQuestionContainer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lnrQuestionContainer =(LinearLayout) findViewById(R.id.lnrQuestionContainer);

        try{
            JSONObject jsonObject = new JSONObject("{\"question\":[{\"ans\":\"test\",\"que\":\"What is your name\"},{\"ans\":\"25-30\",\"que\":\"Age\"}]}");
            JSONArray questionJsonArray =  jsonObject.getJSONArray("question");

            for(int i=0;i<questionJsonArray.length();i++){
                View view = LayoutInflater.from(this).inflate(R.layout.question,null);
                TextView txtQuestion = (TextView) view.findViewById(R.id.txtQuestion);
                TextView txtAnswer = (TextView) view.findViewById(R.id.txtAnswer);

                txtQuestion.setText("Question "+(i+1)+" : "+questionJsonArray.getJSONObject(i).getString("que"));
                txtAnswer.setText("Answer "+(i+1)+" : "+questionJsonArray.getJSONObject(i).getString("ans"));
                lnrQuestionContainer.addView(view);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

答案 1 :(得分:0)

你需要像这样使用膨胀:保留一个item.xml,它将容纳2个TextViews(或根据你的需要使用EditText。)

item.xml:

<RelativeLayout
    android:id="@+id/item_row"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <TextView
        android:id="@+id/que"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true" />

    <TextView
        android:id="@+id/ans"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true" />
</RelativeLayout>    

现在在你的代码中:

您需要在循环中为您的JSONArray中的所有项目充气。所以首先解析JSONArray并得到一个问题,答案对的ArrayList:

ArrayList<String[]> myArr = new ArrayList<String[]>();
for (int i=0; i < myJSONArray.length(); i++) {
    JSONObject j = myJSONArray.getJSONObject(i);
    String[] t = {j.getString("que"),j.getString("ans")};
    myArr.add[t];
}

将此传递给您的活动。

现在您需要遍历ArrayList并使布局膨胀,使用map中的值填充TextViews,并在父布局中添加膨胀的视图:

RelativeLayout container = (RelativeLayout)findViewById(R.id.mylayout);  //this will be your container layout
for (int i = 0; i < secQAArr.size(); i++){

    View item = getLayoutInflater().inflate(R.layout.item, null);
    TextView tQue = (TextView) findViewById(R.id.que);
    que.seText(secQAArr.get(i)[0]);
    TextView tAns = (TextView) findViewById(R.id.ans);
    que.seText(secQAArr.get(i)[1]);
    container.addView(item);
}

希望它有所帮助。