2015-03-03 2 views
1

В настоящее время я работаю над своим первым Android-приложением. Он анализирует данные JSON и помещает их в ListView (см. Ниже).Android - FATAL EXCEPTION: main при добавлении subList

protected void onPostExecute(String result){ 

     try { 
      JSONArray json = new JSONArray(result); 

      for(int i = 0; i < json.length(); i++) { 
       listItems.add(json.getJSONObject(i).getString(("title"))); 
       adapter.notifyDataSetChanged(); 
      } 

     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
    } 

Однако при добавлении Подсписок путем изменения функции к этому:

protected void onPostExecute(String result){ 

     try { 
      JSONArray json = new JSONArray(result); 

      List subList = listItems.subList(1,3); 

      for(int i = 0; i < json.length(); i++) { 
       listItems.add(json.getJSONObject(i).getString(("title"))); 
       subList.add("Test"); 
       adapter.notifyDataSetChanged(); 
      } 

     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
    } 

Он генерирует следующее сообщение об ошибке:

03-03 14:23:56.480 15414-15414/nl.mikehagendoorn.efteltijden E/AndroidRuntime﹕ FATAL EXCEPTION: main 
Process: nl.mikehagendoorn.efteltijden, PID: 15414 
java.lang.IndexOutOfBoundsException 
     at java.util.AbstractList.subList(AbstractList.java:738) 
     at nl.mikehagendoorn.efteltijden.Main$HttpAsyncTask.onPostExecute(Main.java:133) 
     at nl.mikehagendoorn.efteltijden.Main$HttpAsyncTask.onPostExecute(Main.java:117) 
     at android.os.AsyncTask.finish(AsyncTask.java:632) 
     at android.os.AsyncTask.access$600(AsyncTask.java:177) 
     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5221) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 

Может кто-нибудь сказать мне, что я делаю неправильно ?

ответ

1

Проблема здесь:

List subList = listItems.subList(1,3); 

если listItems, пуст или имеет меньше четырех элементов Подсписок броски IndexOutBoundException. Точнее, он выбрасывает IndexOutBoundException, когда (fromIndex < 0 || toIndex > size || fromIndex > toIndex).

Edit:

I would like to put the title in the "Normal" list, and the date of the message in the sublist like this:

вы можете использовать класс, с двумя общественными полями, заголовком и подзаголовком для этой цели. Например.

public class Information { 
    public String mTitle; 
    public String mSubtitle; 
} 

и в вашей для цикла вы могли бы:

for(int i = 0; i < json.length(); i++) { 
    Information tmp = new Information(); 
    tmp.mTitle = son.getJSONObject(i).getString(("title")); 
    tmp.mSubtitle = ".."; 
    listItems.add(tmp); 
    } 

, конечно, вы должны изменить свой список, соответственно, принимать объекты типа Information. В этом случае вся информация, которая вам нужна, хранится в информационном объекте, уменьшая такие проблемы.

+0

Хорошо, это объясняет многое, спасибо. Но теперь, однако, я не совсем уверен, как мне действительно нужно добавить сам сублист. Не могли бы вы объяснить это? – kaanmijo

+0

Зачем нужен подсписок? – Blackbelt

+0

Я хотел бы поместить заголовок в «Обычный» список и дату сообщения в подсписке следующим образом: [link] (http://docs.oracle.com/cd/E35521_01/doc.111230/e24475 /img/main_sub_list.png) – kaanmijo