2015-01-15 5 views
0

Я читаю локальный канал JSON из папки с ресурсами. У меня есть два объекта в моем json-массиве. Я успешно прочитал, а затем поместил данные как пары «ключ/значение» в «Список». Я перебираю список и хочу отображать данные в TextView. Мой Android код активность какКак правильно отредактировать arraylist элементов hashmap

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, и даже моя кнопка не работает и не отображает другую. Пожалуйста помоги.

+0

используйте listview с пользовательским адаптером или вы можете отображать каждый вопрос с параметрами одновременно и заменять только содержимое. – Raghunandan

+0

Почему вы все еще используете обычный синтаксический анализ JSON вместо использования GSON? –

+0

, так как u отправил код u, использует тот же ключ для обоих объектов (для json obj 1 и и obj 2), поэтому hashmap над правом ответом 2 obj inplace 1-го объекта. потому что он получает этот ключ в hashmap ... –

ответ

0

Простейшие является перебрать все HashMaps в ArrayList, а затем перебрать все ключи в карте:

for (HashMap<String, String> map : formList) 
    for (Entry<String, String> entry : map.entrySet()) 
     view.append(entry.getKey() + " => " + entry.getValue()); 
0

Вместо того, чтобы использовать HashMap первый сделать POJO класс викторина затем вставьте класс POJO в ArrayList. Для просмотра данных JSON вы также можете использовать библиотеку GSON.

1

Вы можете поместить значение в 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); 
     } 

и то же самое, используя цикл и будет получить значение из 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(); 
    } 
+0

в выше для цикла мы получим разные данные ключей, но, пожалуйста, скажите мне, как извлечь значения из этой хэш-карты, используя цикл. – aquib23

+0

Итератор myVeryOwnIterator = meMap.keySet(). Iterator(); while (myVeryOwnIterator.hasNext()) { Строковый ключ = (String) myVeryOwnIterator.next(); Строковое значение = (String) meMap.get (ключ); Toast.makeText (ctx, "Key:" + key + "Value:" + value, Toast.LENGTH_LONG) .show(); } u можете использовать код выше, чтобы получить значение. –

+0

Если выше as ценно для u pls upvote и принять его. –

Смежные вопросы