2017-08-16 1 views
-4

Ich habe eine PHP-Seite (urldisplay) dieses Array von Frage Objekten Rückkehr:Fetch JSON Array Arraylist Listview

[{ 
"suggestid": "1", 
"question": "What does Aotearoa mean?", 
"answer1": "Maui and the Whale", 
"answer2": "2 Islands", 
"answer3": "Land of the Long White Cloud", 
"answer4": "Isle of Greenstone", 
"correctanswer": "Land of the Long White Cloud", 
"userID": "1" 
}, { 
"suggestid": "2", 
"question": "What does Haere Ra mean?", 
"answer1": "Hello", 
"answer2": "Goodbye", 
"answer3": "Thanks", 
"answer4": "Sorry", 
"correctanswer": "Goodbye", 
"userID": "1" 
}, { 
"suggestid": "3", 
"question": "Where is Zealand?", 
"answer1": "France", 
"answer2": "Germany", 
"answer3": "Denamrk", 
"answer4": "Finland", 
"correctanswer": "Denmark", 
"userID": "1" 
}, { 
"suggestid": "4", 
"question": "What does Aotearoa mean?", 
"answer1": "Maui and the Whale", 
"answer2": "2 Islands", 
"answer3": "Land of the Long White Cloud", 
"answer4": "Isle of Greenstone", 
"correctanswer": "Land of the Long White Cloud", 
"userID": "2" 
    }, { 
"suggestid": "5", 
"question": "What does Aotearoa mean?", 
"answer1": "Maui and the Whale", 
"answer2": "2 Islands", 
"answer3": "Land of the Long White Cloud", 
"answer4": "Isle of Greenstone", 
"correctanswer": "Land of the Long White Cloud", 
"userID": "3" 
}] 

Ich versuche, die Objekte über diese Klasse zu lesen (in meiner DAO-Klasse), die spart die Ergebnisse zu einem Array Liste von Fragen

ArrayList<Question> quest; 

    public ArrayList<Question> ListSugg() 
{ 
    ListSuggestions sugg = (ListSuggestions)new ListSuggestions().execute(); 
    return quest; 
} 

public class ListSuggestions extends AsyncTask<Void, Void, Void> { 

    @Override 
    protected Void doInBackground(Void... params) { 

     try { 
      URL url = new URL(urldisplay); 
      HttpURLConnection con = (HttpURLConnection) url.openConnection(); 
      JSONArray jsonArray = new JSONArray(con); 
      quest = new ArrayList<Question>(); 
      for (int i = 0; i < jsonArray.length(); i++) { 
       JSONObject jsonObject = jsonArray.getJSONObject(i); 
       String question = jsonObject.getString("question"); 
       String answer1 = jsonObject.getString("answer1"); 
       String answer2 = jsonObject.getString("answer2"); 
       String answer3 = jsonObject.getString("answer3"); 
       String answer4 = jsonObject.getString("answer4"); 
       String correctanswer = jsonObject.getString("correctanswer"); 
       Question ques = new Question(0, question, answer1, answer2, answer3, answer4, correctanswer); 
       quest.add(ques); 
      } 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (JSONException e1) { 
      e1.printStackTrace(); 
     } 
     return null; 
    } 
} 

Quest bleibt leer, obwohl. Ich möchte dann die Frageobjekte zu einer ListView hinzufügen.

public class ListActivity extends AppCompatActivity { 
ListView listv; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_list); 
    listv = (ListView)findViewById(R.id.ListDisplay); 
    DAO dao = new DAO(); 
    ArrayList list = dao.ListSugg(); 
    ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(
      this, 
      android.R.layout.simple_list_item_1, 
      list); 

    listv.setAdapter(arrayAdapter); 
} 

Ich habe ein paar andere SO-Posts ausprobiert, aber ich scheine meinen Schwanz zu verfolgen. Kann jemand meine Fehler erkennen/Gibt es einen besseren Weg für mich, dies zu tun?

Cheers,

+0

Was ist der Fehler Sie konfrontiert sind? –

+0

Fragen, die Debugging-Hilfe suchen ("Warum funktioniert dieser Code nicht?") Müssen das gewünschte Verhalten, ein bestimmtes Problem oder einen Fehler und den kürzesten Code enthalten, der für die Reproduktion in der Frage erforderlich ist. Fragen ohne eine klare Problemstellung sind für andere Leser nicht nützlich. Siehe: [Wie man ein minimales, vollständiges und überprüfbares Beispiel erstellt.] (Https://stackoverflow.com/help/mcve) – LazerBanana

+0

Das jsonarray ist leer, also schlägt es bei der for-Schleife fehl – Gremio

Antwort

1

Das Problem ist, dass AsyncTask Code asunchrounsly ausführt, was bedeutet, dass beim Aufruf ListSugg() die Hintergrundaufgabe in einem anderen Thread ausgeführt wird und das Questobjekt zurückgibt, bevor die Hintergrundquest beendet ist, was bedeutet, dass Sie noch leer sind Liste. read here for more info

Was Sie tun können, ist, dass Sie die onPostExecute Methode überschreiben, und setzen Sie den Adapter gibt, etwa so:

public class ListSuggestions extends AsyncTask<Void, Void, Void> { 

    @Override 
    protected Boolean doInBackground(String... params) { 
     // do something 
     return true; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     // The results of the above method 
     // Processing the results here 

     ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(
      this, 
      android.R.layout.simple_list_item_1, 
      list); 

     listv.setAdapter(arrayAdapter); 

    } 

} 

Aber dies funktioniert, müssen Sie Ihre AsyncTask innerhalb des MainActivity aufzunehmen.

Dies sollte Ihr Problem lösen, hoffe es hilft.

Allerdings gibt es viel bessere und einfachere Lösungen wie die Verwendung einer HTTP-Netzwerk-Bibliothek wie okhttp oder Retrofit, und mit einem JSON-Parser wie Gson, können Sie sie auschecken, wenn Sie möchten.

+0

Danke, das zeigt mir in die richtige Richtung ! – Gremio

0

Sie kehren ques sobald Sie die Aufgabe Hintergrund feuern. Die Hintergrund-Aufgabe wird einige Zeit dauern und bis dahin wird Ihre Liste Null bleiben, so dass Sie keine Daten sehen werden.

Aktualisieren Sie die Liste in der postExecute Methode von AsyncTask.

0

versuchen diese

 quest = new ArrayList<Question>(); 
     for (int i = 0; i < jsonArray.length(); i++) { 

      JSONObject jsonObject = jsonArray.getJSONObject(i); 

      Question ques = new Question(); //inti Question 
      //Enter Values to Question Object 
      ques.setQuestion(jsonObject.getString("question")); 
      ques.setAnswer1(jsonObject.getString("answer1")); 
      ques.setAnswer2(jsonObject.getString("answer2")); 
      ques.setAnswer3(jsonObject.getString("answer3")); 
      ques.setAnswer4(jsonObject.getString("answer4")); 
      ques.setCorrectAnswer(jsonObject.getString("correctanswer")); 
      // Add Question Object to ArrayList 
      quest.add(ques); 
     } 
0

Es ist leer, weil Sie von der doInBackground null zurückkehren(). Der ideale Weg ist, das Ergebnis an onPostExecute() übergeben und den Adapter dort.Wie folgt: -

public class ListSuggestions extends AsyncTask<Void, Void, ArrayList<Question>> { 

    @Override 
    protected ArrayList<Question> doInBackground(Void... params) { 

     try { 
      URL url = new URL(urldisplay); 
      HttpURLConnection con = (HttpURLConnection) url.openConnection(); 
      //JSONArray jsonArray = new JSONArray(con); 
      quest = new ArrayList<Question>(); 
      for (int i = 0; i < jsonArray.length(); i++) { 
       JSONObject jsonObject = jsonArray.getJSONObject(i); 
       String question = jsonObject.getString("question"); 
       String answer1 = jsonObject.getString("answer1"); 
       String answer2 = jsonObject.getString("answer2"); 
       String answer3 = jsonObject.getString("answer3"); 
       String answer4 = jsonObject.getString("answer4"); 
       String correctanswer = jsonObject.getString("correctanswer"); 
       Question ques = new Question(0, question, answer1, answer2, answer3, answer4, correctanswer); 
       quest.add(ques); 
      } 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (JSONException e1) { 
      e1.printStackTrace(); 
     } 
     return quest; 
    } 

    @Override 
    protected void onPostExecute(ArrayList<Question> questions) { 
     super.onPostExecute(questions); 

     ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(
       this, 
       android.R.layout.simple_list_item_1, 
       list); 

     listv.setAdapter(arrayAdapter); 
    } 
}