Получить массив JSON в ArrayList для ListView

У меня есть страница php (urldisplay), возвращающая этот массив объектов вопроса:

[{
"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"}]

Я пытаюсь прочитать объекты через этот класс (в моем классе DAO), который сохраняет результаты в виде списка вопросов

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;
}
}

квест остается пустым, хотя. Затем я хочу добавить объекты вопроса в ListView.

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);
}

Я перепробовал кучу других ТАК, но мне кажется, что я гоняюсь за своим хвостом. Может кто-нибудь заметить мои ошибки / есть ли лучший способ сделать это?

Ура,

-4

Решение

Проблема в том, что AsyncTask выполняет код Asunchrounsly, что означает, что при вызове ListSugg(), он запустит фоновую задачу в другом потоке и вернет вам объект квеста до того, как фоновый квест будет завершен, то есть у вас будет еще пустой список. Прочитайте здесь для дополнительной информации

Что вы можете сделать, это то, что вы отменяете onPostExecute метод, и установите адаптер там, вот так:

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);

}

}

Но чтобы это работало, вам нужно включить AsyncTask в MainActivity.

Это должно решить вашу проблему, надеюсь, это поможет.

Однако есть намного лучшие и более простые решения, такие как использование сетевой библиотеки HTTP, такой как okhttp или Retrofit, и использование парсера JSON, такого как Gson, вы можете проверить их, если хотите.

1

Другие решения

Вы возвращаетесь ques как только вы запустите фоновое задание. Фоновое задание займет некоторое время, и до ques список останется нулевым, поэтому вы не увидите данных.

Обновите список в postExecute метод AsyncTask.

0

попробуй это

        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

Он пуст, потому что вы возвращаете null из doInBackground (). Идеальный способ — передать результат в onPostExecute () и установить там адаптер.

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);
}
}
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector