我目前正在开发我的第一个Android应用程序。 它解析JSON数据并将其放在ListView中(见下文)。
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)
有人能告诉我我做错了吗?
答案 0 :(得分:1)
问题在于:
List subList = listItems.subList(1,3);
如果listItems
为空或者少于四个元素,则subList抛出IndexOutBoundException
。更准确地说,它会在IndexOutBoundException
时抛出(fromIndex < 0 || toIndex > size || fromIndex > toIndex)
。
编辑:
我想把标题放在&#34; Normal&#34;清单和日期 子列表中的消息如下:
你可以使用一个类,有两个公共字段,标题和副标题用于此目的。 E.g。
public class Information {
public String mTitle;
public String mSubtitle;
}
在您的for循环中,您可以:
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
类型的对象。在这种情况下,您需要的所有信息都由信息对象保留,从而减少了这类问题