Ошибка ArrayAdapter, когда в массиве находится более одного элемента
У меня есть ошибка, когда я получаю массив, который имеет более одного значения в ListView... он падает...
str_amparticipant_firstname - это массив строковых значений. str_pmparticipant_firstname также является массивом строковых значений.
adapteram = new ArrayAdapter<String>(Attend.this, android.R.layout.simple_list_item_1, str_amparticipant_firstname);
adapterpm = new ArrayAdapter<String>(Attend.this, android.R.layout.simple_list_item_1, str_pmparticipant_firstname);
amattendees.setAdapter(adapteram);
pmattendees.setAdapter(adapterpm);
Класс называется Attend. ListViews показывают значения в массиве, когда в массиве есть одно значение. Если существует более одного значения, приложение вылетает. Я проверил, что массив заполняется правильно, и это так. Надеюсь, в журнале ошибок есть ответ. Журнал ошибок, который я получаю, находится ниже:
04-16 19:28:57.664: E/AndroidRuntime(5807): FATAL EXCEPTION: main
04-16 19:28:57.664: E/AndroidRuntime(5807): java.lang.NullPointerException
04-16 19:28:57.664: E/AndroidRuntime(5807): at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:355)
04-16 19:28:57.664: E/AndroidRuntime(5807): at android.widget.ArrayAdapter.getView(ArrayAdapter.java:323)
04-16 19:28:57.664: E/AndroidRuntime(5807): at android.widget.AbsListView.obtainView(AbsListView.java:1430)
04-16 19:28:57.664: E/AndroidRuntime(5807): at android.widget.ListView.measureHeightOfChildren(ListView.java:1307)
04-16 19:28:57.664: E/AndroidRuntime(5807): at android.widget.ListView.onMeasure(ListView.java:1127)
04-16 19:28:57.664: E/AndroidRuntime(5807): at android.view.View.measure(View.java:8510)
04-16 19:28:57.664: E/AndroidRuntime(5807): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3202)
04-16 19:28:57.664: E/AndroidRuntime(5807): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1017)
04-16 19:28:57.664: E/AndroidRuntime(5807): at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:701)
04-16 19:28:57.664: E/AndroidRuntime(5807): at android.widget.LinearLayout.onMeasure(LinearLayout.java:311)
04-16 19:28:57.664: E/AndroidRuntime(5807): at android.view.View.measure(View.java:8510)
04-16 19:28:57.664: E/AndroidRuntime(5807): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3202)
04-16 19:28:57.664: E/AndroidRuntime(5807): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1017)
04-16 19:28:57.664: E/AndroidRuntime(5807): at android.widget.LinearLayout.measureVertical(LinearLayout.java:386)
04-16 19:28:57.664: E/AndroidRuntime(5807): at android.widget.LinearLayout.onMeasure(LinearLayout.java:309)
04-16 19:28:57.664: E/AndroidRuntime(5807): at android.view.View.measure(View.java:8510)
04-16 19:28:57.664: E/AndroidRuntime(5807): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3202)
04-16 19:28:57.664: E/AndroidRuntime(5807): at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
04-16 19:28:57.664: E/AndroidRuntime(5807): at android.view.View.measure(View.java:8510)
04-16 19:28:57.664: E/AndroidRuntime(5807): at android.widget.LinearLayout.measureVertical(LinearLayout.java:531)
04-16 19:28:57.664: E/AndroidRuntime(5807): at android.widget.LinearLayout.onMeasure(LinearLayout.java:309)
04-16 19:28:57.664: E/AndroidRuntime(5807): at android.view.View.measure(View.java:8510)
04-16 19:28:57.664: E/AndroidRuntime(5807): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3202)
04-16 19:28:57.664: E/AndroidRuntime(5807): at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
04-16 19:28:57.664: E/AndroidRuntime(5807): at android.view.View.measure(View.java:8510)
04-16 19:28:57.664: E/AndroidRuntime(5807): at android.view.ViewRoot.performTraversals(ViewRoot.java:871)
04-16 19:28:57.664: E/AndroidRuntime(5807): at android.view.ViewRoot.handleMessage(ViewRoot.java:1921)
04-16 19:28:57.664: E/AndroidRuntime(5807): at android.os.Handler.dispatchMessage(Handler.java:99)
04-16 19:28:57.664: E/AndroidRuntime(5807): at android.os.Looper.loop(Looper.java:143)
04-16 19:28:57.664: E/AndroidRuntime(5807): at android.app.ActivityThread.main(ActivityThread.java:4196)
04-16 19:28:57.664: E/AndroidRuntime(5807): at java.lang.reflect.Method.invokeNative(Native Method)
04-16 19:28:57.664: E/AndroidRuntime(5807): at java.lang.reflect.Method.invoke(Method.java:507)
04-16 19:28:57.664: E/AndroidRuntime(5807): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
04-16 19:28:57.664: E/AndroidRuntime(5807): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
04-16 19:28:57.664: E/AndroidRuntime(5807): at dalvik.system.NativeStart.main(Native Method)
опять ошибка появляется только тогда, когда в массиве более одного значения. Я попытался найти ответ на эту проблему, но я не смог найти информацию об ошибке. пожалуйста помоги! благодарю вас!
ОБНОВЛЕНИЕ: вот как массив заполняется и создается:
for(int i = 0; i < json_array_amparticipants.length(); i++){
//store all the amparticipants
str_amparticipant_email = new String[json_array_amparticipants.length()];
str_amparticipant_firstname = new String[json_array_amparticipants.length()];
str_amparticipant_lastname = new String[json_array_amparticipants.length()];
str_amparticipant_attendingam = new String[json_array_amparticipants.length()];
str_amparticipant_attendingpm = new String[json_array_amparticipants.length()];
//full_name_am = new String[json_array_amparticipants.length()];
str_amparticipant_email[i] = json_array_amparticipants.getJSONObject(i).getString("email");
str_amparticipant_firstname[i] = json_array_amparticipants.getJSONObject(i).getString("first_name");
str_amparticipant_lastname[i] = json_array_amparticipants.getJSONObject(i).getString("last_name");
str_amparticipant_attendingam[i] = json_array_amparticipants.getJSONObject(i).getString("attending_am");
str_amparticipant_attendingpm[i] = json_array_amparticipants.getJSONObject(i).getString("attending_pm");
//full_name_am[i] = str_amparticipant_firstname[i] + str_amparticipant_lastname[i];
}
ИСПРАВЛЕНО: я каждый раз создаю новые массивы, поэтому он сохраняет значение, но вызывает сбой... вот и обновленное исправление. Ура ребята:
//store all the amparticipants
str_amparticipant_email = new String[json_array_amparticipants.length()];
str_amparticipant_firstname = new String[json_array_amparticipants.length()];
str_amparticipant_lastname = new String[json_array_amparticipants.length()];
str_amparticipant_attendingam = new String[json_array_amparticipants.length()];
str_amparticipant_attendingpm = new String[json_array_amparticipants.length()];
for(int i = 0; i < json_array_amparticipants.length(); i++){
//full_name_am = new String[json_array_amparticipants.length()];
str_amparticipant_email[i] = json_array_amparticipants.getJSONObject(i).getString("email");
str_amparticipant_firstname[i] = json_array_amparticipants.getJSONObject(i).getString("first_name");
str_amparticipant_lastname[i] = json_array_amparticipants.getJSONObject(i).getString("last_name");
str_amparticipant_attendingam[i] = json_array_amparticipants.getJSONObject(i).getString("attending_am");
str_amparticipant_attendingpm[i] = json_array_amparticipants.getJSONObject(i).getString("attending_pm");
//full_name_am[i] = str_amparticipant_firstname[i] + str_amparticipant_lastname[i];
}
2 ответа
Это должно быть за пределами вашего цикла:
str_amparticipant_email = new String[json_array_amparticipants.length()];
str_amparticipant_firstname = new String[json_array_amparticipants.length()];
str_amparticipant_lastname = new String[json_array_amparticipants.length()];
str_amparticipant_attendingam = new String[json_array_amparticipants.length()];
str_amparticipant_attendingpm = new String[json_array_amparticipants.length()];
Вы воссоздаете массивы каждый раз, когда входите в цикл, стирая все предыдущие значения.
Я предполагаю, что ошибка здесь:
str_amparticipant_firstname[i] = json_array_amparticipants.getJSONObject(i).getString("first_name");
str_amparticipant_lastname[i] = json_array_amparticipants.getJSONObject(i).getString("last_name");
Возможно ли, что эти ключи не находятся в JSONObject? Это объясняет исключение нулевого указателя.