java - 如何正确迭代 HashMap 元素的数组列表

标签 java android json

我正在从 Assets 文件夹中读取本地 JSON 源。我的 json 数组中有两个对象。我已成功读取,然后将数据作为键/值对放入列表中。我已经迭代了列表并希望在 TextView 中显示数据。我的 Android Activity 代码如下

package com.aquib.quizapp;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.TextView;

public class QuizActivity extends Activity {

    TextView questionName;
    RadioButton option1, option2, option3, option4;
    Button nextQuestion;
    String questionValue, option1Value, option2Value, option3Value,
            option4Value;
    int questionNumber = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_quiz);
        questionName = (TextView) findViewById(R.id.qestionName);
        option1 = (RadioButton) findViewById(R.id.option1);
        option2 = (RadioButton) findViewById(R.id.option2);
        option3 = (RadioButton) findViewById(R.id.option3);
        option4 = (RadioButton) findViewById(R.id.option4);
        nextQuestion = (Button) findViewById(R.id.next_question);

        try {
            readJSON();
        } catch (JSONException e) {
            e.printStackTrace();
        }
        setView(questionNumber, questionValue, option1Value, option2Value,
                option3Value, option4Value);

        if (questionNumber < 3) {
            nextQuestion.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    setView(questionNumber, questionValue, option1Value,
                            option2Value, option3Value, option4Value);
                }
            });
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.quiz, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    public String loadJSONFromAsset() {
        String data = null;
        try {

            InputStream is = getAssets().open("quiz.json");
            int size = is.available();
            byte[] buffer = new byte[size];
            is.read(buffer);
            is.close();
            data = new String(buffer, "UTF-8");
        } catch (IOException ex) {
            ex.printStackTrace();
            return null;
        }
        return data;
    }

    public void readJSON() throws JSONException {

        JSONObject object = new JSONObject(loadJSONFromAsset());
        JSONArray jArray = object.getJSONArray("quiz");
        List<HashMap<String, String>> formList = new ArrayList<HashMap<String, String>>();
        HashMap<String, String> m_li = null;

        for (int i = 0; i < jArray.length(); i++) {

            JSONObject data = jArray.getJSONObject(i);

            int questionNumberValue = data.getInt("question_number");
            String queNumber = String.valueOf(questionNumberValue);
            String questionValue = data.getString("question");
            String option1Value = data.getString("option1");
            String option2Value = data.getString("option2");
            String option3Value = data.getString("option3");
            String option4Value = data.getString("option4");

            Log.d("Details-->", questionValue);
            Log.d("Question Number", queNumber);

            // Add your values in your `ArrayList` as below:

            m_li = new HashMap<String, String>();
            m_li.put("question_number", queNumber);
            m_li.put("question", questionValue);
            m_li.put("option1", option1Value);
            m_li.put("option2", option2Value);
            m_li.put("option3", option3Value);
            m_li.put("option4", option4Value);

            formList.add(m_li);
        }

        Iterator<HashMap<String, String>> itr = formList.iterator();
        while (itr.hasNext()) {
            HashMap<String, String> map = (HashMap<String, String>) itr.next();
            questionNumber = Integer.parseInt(map.get("question_number"));
            questionValue = map.get("question");
            option1Value = map.get("option1");
            option2Value = map.get("option2");
            option3Value = map.get("option3");
            option4Value = map.get("option4");
            Log.d("Question Number", String.valueOf(questionNumber));
            Log.d("Question Name", questionValue);
            Log.d("Option 1", option1Value);
            Log.d("Option 2", option2Value);
            Log.d("Option 3", option3Value);
            Log.d("Option 4", option4Value);

        }

    }

    private void setView(int questionNumber, String questionValue,
            String option1Value, String option2Value, String option3Value,
            String option4Value) {

        questionName.setText("Q." + String.valueOf(questionNumber)
                + questionValue);
        option1.setText(option1Value);
        option2.setText(option2Value);
        option3.setText(option3Value);
        option4.setText(option4Value);
        questionNumber++;
    }
}

我的 json 文件是这样的

{
    "quiz": [
    {
      "question_number" : 0,
      "question": "What is capital of India?",
      "option1": "New Delhi",
      "option2": "Agra",
      "option3": "Noida",
      "option4": "Jaipur"
    },

    {
      "question_number" : 1,
      "question": "What is capital of Rajasthan?",
      "option1": "Agra",
      "option2": "New Delhi",
      "option3": "Lucknow",
      "option4": "Noida"
    }
  ]
}

我在 Logcat 中得到了正确的结果。但我不知道为什么第二个 json 数据首先显示,甚至我的按钮也不起作用并且不显示其他数据。请帮忙。

最佳答案

你可以用这种方式将值放入 HashMap 中

for (int i = 0; i < jArray.length(); i++) {

            JSONObject data = jArray.getJSONObject(i);

            int questionNumberValue = data.getInt("question_number");
            String queNumber = String.valueOf(questionNumberValue);
            String questionValue = data.getString("question");
            String option1Value = data.getString("option1");
            String option2Value = data.getString("option2");
            String option3Value = data.getString("option3");
            String option4Value = data.getString("option4");

            Log.d("Details-->", questionValue);
            Log.d("Question Number", queNumber);

            // Add your values in your `ArrayList` as below:

            m_li = new HashMap<String, String>();
            m_li.put("question_number"+i, queNumber);
            m_li.put("question"+i, questionValue);
            m_li.put("option1"+i, option1Value);
            m_li.put("option2"+i, option2Value);
            m_li.put("option3"+i, option3Value);
            m_li.put("option4"+i, option4Value);

            formList.add(m_li);
        }

同样使用for循环你将从hashmap中获取值..

用于从 HashMap 中获取值..

      Iterator myVeryOwnIterator = meMap.keySet().iterator();  
while(myVeryOwnIterator.hasNext()) { 
    String key=(String)myVeryOwnIterator.next();
     String value=(String)meMap.get(key);
     Toast.makeText(ctx, "Key: "+key+" Value: "+value, Toast.LENGTH_LONG).show(); 
    }

关于java - 如何正确迭代 HashMap 元素的数组列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27957315/

相关文章:

java - 顶部带有 JComponents 的动画

java - 尽管使用 c3p0 仍出现 `Could not open connection` 问题

javascript - 从 json 中删除项目,再次点击

android - Firebase:检查 JSON 中的更改并自动发送通知

json - 如何在 Play 框架 v2.0 中呈现 JSON 响应(来自 GIT 的最新版本)

java - 我应该如何处理 JSoup 中删除的元素?

java - 获取Spring WebClient请求的状态码

android - 销毁时如何从 Activity 中解除绑定(bind)viewModel

Android build.gradle defaultConfig { resConfig "en"} 对 Google Play 商店本地化和分发的影响

java - 模拟 Android REST 连接的最佳方式