【问题标题】:java.lang.IndexOutOfBoundsException: Invalid index 9, size is 1java.lang.IndexOutOfBoundsException:索引 9 无效,大小为 1
【发布时间】:2014-01-20 13:01:06
【问题描述】:

我在 android Pull to refresh listview 中工作。它工作正常,但在刷新 listview 时,我试图向下滚动列表。我收到此错误:

这是我的代码:

public void Callpagedetails() {

        try
            {


         URL = http://history_thread.php?token_id=" + Token + "&p=" +                       page_count;                   
                Log.d("TAG", "API URL IS " + URL);

                HttpClient mHttpClient = new DefaultHttpClient();

                HttpGet mGetMethod = new HttpGet(URL);

                HttpResponse mReponseMessage = mHttpClient.execute(mGetMethod);

                String Response = EntityUtils.toString(mReponseMessage.getEntity());

                Log.d("TAG", "O/P Response is " + Response);

                JSONArray responseObject = new JSONArray(Response);

                          for(int i=0; i < responseObject.length(); i++)

                    {
                        obj = responseObject.getJSONObject(i);

                        listhashmap = new HashMap<String, Object>();

                        listhashmap.put("text",obj.getString("text"));

                here i am storing the item in arraylist arraylistitems


                    }
}
catch(Exception e)
{
System.out.println(e);
}

    }

arraylistitems 是ArrayList&lt;HashMap&lt;String, Object&gt;&gt; arraylistitems;

Callpagedetails() 是我从中获取数据的方法

    01-20 18:22:17.755: E/InputEventReceiver(23393): Exception dispatching input event.
01-20 18:22:17.755: E/MessageQueue-JNI(23393): Exception in MessageQueue callback: handleReceiveCallback
01-20 18:22:17.775: E/MessageQueue-JNI(23393): java.lang.IndexOutOfBoundsException: Invalid index 9, size is 1
01-20 18:22:17.775: E/MessageQueue-JNI(23393):  at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
01-20 18:22:17.775: E/MessageQueue-JNI(23393):  at java.util.ArrayList.get(ArrayList.java:304)
01-20 18:22:17.775: E/MessageQueue-JNI(23393):  at android.widget.HeaderViewListAdapter.isEnabled(HeaderViewListAdapter.java:164)
01-20 18:22:17.775: E/MessageQueue-JNI(23393):  at android.widget.AbsListView.onTouchEvent(AbsListView.java:3816)
01-20 18:22:17.775: E/MessageQueue-JNI(23393):  at com.listview.HistoryListView.onTouchEvent(HistoryListView.java:316)
01-20 18:22:17.775: E/MessageQueue-JNI(23393):  at com.listview.HistoryListView.onInterceptTouchEvent(HistoryListView.java:380)
01-20 18:22:17.775: E/MessageQueue-JNI(23393):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1827)
01-20 18:22:17.775: E/MessageQueue-JNI(23393):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2185)
01-20 18:22:17.775: E/MessageQueue-JNI(23393):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1886)
01-20 18:22:17.775: E/MessageQueue-JNI(23393):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2185)
01-20 18:22:17.775: E/MessageQueue-JNI(23393):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1886)
01-20 18:22:17.775: E/MessageQueue-JNI(23393):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2185)
01-20 18:22:17.775: E/MessageQueue-JNI(23393):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1886)
01-20 18:22:17.775: E/MessageQueue-JNI(23393):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2185)
01-20 18:22:17.775: E/MessageQueue-JNI(23393):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1886)
01-20 18:22:17.775: E/MessageQueue-JNI(23393):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2185)
01-20 18:22:17.775: E/MessageQueue-JNI(23393):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1886)
01-20 18:22:17.775: E/MessageQueue-JNI(23393):  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2113)
01-20 18:22:17.775: E/MessageQueue-JNI(23393):  at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1466)
01-20 18:22:17.775: E/MessageQueue-JNI(23393):  at android.app.Activity.dispatchTouchEvent(Activity.java:2436)
01-20 18:22:17.775: E/MessageQueue-JNI(23393):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2061)
01-20 18:22:17.775: E/MessageQueue-JNI(23393):  at android.view.View.dispatchPointerEvent(View.java:7425)
01-20 18:22:17.775: E/MessageQueue-JNI(23393):  at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3376)
01-20 18:22:17.775: E/MessageQueue-JNI(23393):  at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3308)
01-20 18:22:17.775: E/MessageQueue-JNI(23393):  at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4402)
01-20 18:22:17.775: E/MessageQueue-JNI(23393):  at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4380)
01-20 18:22:17.775: E/MessageQueue-JNI(23393):  at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:4484)
01-20 18:22:17.775: E/MessageQueue-JNI(23393):  at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:171)
01-20 18:22:17.775: E/MessageQueue-JNI(23393):  at android.os.MessageQueue.nativePollOnce(Native Method)
01-20 18:22:17.775: E/MessageQueue-JNI(23393):  at android.os.MessageQueue.next(MessageQueue.java:125)
01-20 18:22:17.775: E/MessageQueue-JNI(23393):  at android.os.Looper.loop(Looper.java:124)
01-20 18:22:17.775: E/MessageQueue-JNI(23393):  at android.app.ActivityThread.main(ActivityThread.java:4918)
01-20 18:22:17.775: E/MessageQueue-JNI(23393):  at java.lang.reflect.Method.invokeNative(Native Method)
01-20 18:22:17.775: E/MessageQueue-JNI(23393):  at java.lang.reflect.Method.invoke(Method.java:511)
01-20 18:22:17.775: E/MessageQueue-JNI(23393):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1004)
01-20 18:22:17.775: E/MessageQueue-JNI(23393):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:771)
01-20 18:22:17.775: E/MessageQueue-JNI(23393):  at dalvik.system.NativeStart.main(Native Method)
01-20 18:22:17.785: E/AndroidRuntime(23393): FATAL EXCEPTION: main
01-20 18:22:17.785: E/AndroidRuntime(23393): java.lang.IndexOutOfBoundsException: Invalid index 9, size is 1
01-20 18:22:17.785: E/AndroidRuntime(23393):    at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
01-20 18:22:17.785: E/AndroidRuntime(23393):    at java.util.ArrayList.get(ArrayList.java:304)
01-20 18:22:17.785: E/AndroidRuntime(23393):    at android.widget.HeaderViewListAdapter.isEnabled(HeaderViewListAdapter.java:164)
01-20 18:22:17.785: E/AndroidRuntime(23393):    at android.widget.AbsListView.onTouchEvent(AbsListView.java:3816)
01-20 18:22:17.785: E/AndroidRuntime(23393):    at com.listview.HistoryListView.onTouchEvent(HistoryListView.java:316)
01-20 18:22:17.785: E/AndroidRuntime(23393):    at com.listview.HistoryListView.onInterceptTouchEvent(HistoryListView.java:380)
01-20 18:22:17.785: E/AndroidRuntime(23393):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1827)
01-20 18:22:17.785: E/AndroidRuntime(23393):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2185)
01-20 18:22:17.785: E/AndroidRuntime(23393):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1886)
01-20 18:22:17.785: E/AndroidRuntime(23393):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2185)
01-20 18:22:17.785: E/AndroidRuntime(23393):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1886)
01-20 18:22:17.785: E/AndroidRuntime(23393):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2185)
01-20 18:22:17.785: E/AndroidRuntime(23393):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1886)
01-20 18:22:17.785: E/AndroidRuntime(23393):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2185)
01-20 18:22:17.785: E/AndroidRuntime(23393):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1886)
01-20 18:22:17.785: E/AndroidRuntime(23393):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2185)
01-20 18:22:17.785: E/AndroidRuntime(23393):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1886)
01-20 18:22:17.785: E/AndroidRuntime(23393):    at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2113)
01-20 18:22:17.785: E/AndroidRuntime(23393):    at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1466)
01-20 18:22:17.785: E/AndroidRuntime(23393):    at android.app.Activity.dispatchTouchEvent(Activity.java:2436)
01-20 18:22:17.785: E/AndroidRuntime(23393):    at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2061)
01-20 18:22:17.785: E/AndroidRuntime(23393):    at android.view.View.dispatchPointerEvent(View.java:7425)
01-20 18:22:17.785: E/AndroidRuntime(23393):    at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3376)
01-20 18:22:17.785: E/AndroidRuntime(23393):    at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3308)
01-20 18:22:17.785: E/AndroidRuntime(23393):    at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4402)
01-20 18:22:17.785: E/AndroidRuntime(23393):    at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4380)
01-20 18:22:17.785: E/AndroidRuntime(23393):    at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:4484)
01-20 18:22:17.785: E/AndroidRuntime(23393):    at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:171)
01-20 18:22:17.785: E/AndroidRuntime(23393):    at android.os.MessageQueue.nativePollOnce(Native Method)
01-20 18:22:17.785: E/AndroidRuntime(23393):    at android.os.MessageQueue.next(MessageQueue.java:125)
01-20 18:22:17.785: E/AndroidRuntime(23393):    at android.os.Looper.loop(Looper.java:124)
01-20 18:22:17.785: E/AndroidRuntime(23393):    at android.app.ActivityThread.main(ActivityThread.java:4918)
01-20 18:22:17.785: E/AndroidRuntime(23393):    at java.lang.reflect.Method.invokeNative(Native Method)
01-20 18:22:17.785: E/AndroidRuntime(23393):    at java.lang.reflect.Method.invoke(Method.java:511)
01-20 18:22:17.785: E/AndroidRuntime(23393):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1004)
01-20 18:22:17.785: E/AndroidRuntime(23393):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:771)
01-20 18:22:17.785: E/AndroidRuntime(23393):    at dalvik.system.NativeStart.main(Native Method)

谁能帮帮我。谢谢。

【问题讨论】:

  • 没有代码我们如何提供帮助?????
  • 请贴刷新方法代码
  • 向下滚动时检查是否更换了适配器。
  • 你什么时候调用 RefreshTask.execute()?
  • 你应该确保添加适配器扩展的所有代码,这是它失败的关键。

标签: android android-listview pull-to-refresh


【解决方案1】:

我没有尝试,但肯定对你有帮助。

                JSONArray responseObject = new JSONArray(Response);
                listhashmap = new HashMap<String, Object>();
                for(int i=0; i < responseObject.length(); i++)
                {
                    obj = responseObject.getJSONObject(i);
                    listhashmap.put("text",obj.getString("text"));

                }

【讨论】:

  • 是的,因为您使用静态“文本”值,所以获取最后一项。在 Hashmap 中应该分配不同的键。它与仅一个记录(最后一个)显示相同的密钥传递。所以传递键值不同。像 listhashmap.put(obj.getString("uniqueKey"),obj.getString("text"));在 uniqueKey 中传递您的 id 字段。你可以通过这个id获取记录
  • 也通过 listhashmap.put(i,obj.getString("text"));你可以解决你的问题
  • 我试过这样,但我只得到最后一项
  • 请确保您的键值不同。请在插入 listhashmap.put(key,value) 之前检查日志。
  • insted 的字符串将 i 作为键,因为如果您的字符串值与它相同,则只考虑 hashmap 中的一项。
【解决方案2】:

您不应在非 UI 线程中接触适配器的数据。

您的doInBackground() 似乎将适配器可能使用的计数设置为零,并且还猜测Callpagedetails() 直接修改了适配器使用的数据。

改为在 UI 线程中修改适配器的数据。 onPostExecute() 是个不错的地方。

【讨论】:

  • 谢谢,但我只修改了 onPostExecute() 中的适配器数据
  • 您发布的代码不会修改onPostExecute() 中的基础数据,它实际上只是调用notifyDataSetChanged()。所以我猜你正在修改doInBackground()中的数据。
  • 但在 Callpagedetails() 中,我只检索数据并存储在数组中
  • ...我假设适配器同时使用了相同的数组。
  • 将数据收集到另一个数组中并在 UI 线程中将其交换到适配器中。
【解决方案3】:

在您的 Callpagedetails 中,查看实例化 responseObject 之后的 for 循环。

您保留初始列表哈希图。这就是为什么你 listhashmap 的大小为 1。将新的 HashMap 替换为外部 for 循环。

for (int i = 0; i < responseObject.length(); i++) {
    obj = r esponseObject.getJSONObject(i);
    listhashmap = new HashMap < String, Object > ();  // problems code
    listhashmap.put("text", obj.getString("text"));
}

【讨论】:

  • 你的意思是我必须在 for 循环之外调用 listhashmap
  • 是的,在循环之外实例化您的 listhashmap。
  • 那么只有第一个项目存储在列表视图中
【解决方案4】:

受保护的类 RefreshTask 扩展 AsyncTask>> {

        @Override
        protected ArrayList<HashMap<String, Object>> doInBackground(Void... params) {
            // TODO Auto-generated method stub
            page_count = 0;
            ArrayList<HashMap<String, Object>> data=Callpagedetails();
            return data;

        }

        protected void onPostExecute(ArrayList<HashMap<String, Object>> result) {
            super.onPostExecute(result);
        if(result!=null)
        {
             adapterfirst = new Questionadapter(historylist.this,result);
             listviewfirst = (RefeshListView) findViewById(R.id.listquestion);
             listviewfirst.setAdapter(adapterfirst);
                adapterfirst.notifyDataSetChanged();
        }
         yourlistView.postDelayed(new Runnable() {

            @Override
            public void run() {
                 new RefreshTask().execute();  
            }
        }, 1000);

}
        }
    }

嗨,普里亚!试试这个程序!将对象作为参数传递给 onpostExecute 始终是一种好方法!希望这能解决您的问题!

【讨论】:

  • 我已经尝试过了,但是在刷新时如果尝试滚动列表视图,我会收到错误
【解决方案5】:

这可能不准确。但尝试相应地修改,

 public void Callpagedetails() {

    try
        {
     URL = http://history_thread.php?token_id=" + Token + "&p=" +                       page_count;                   
            Log.d("TAG", "API URL IS " + URL);

            HttpClient mHttpClient = new DefaultHttpClient();

            HttpGet mGetMethod = new HttpGet(URL);

            HttpResponse mReponseMessage = mHttpClient.execute(mGetMethod);

            String Response = EntityUtils.toString(mReponseMessage.getEntity());

            Log.d("TAG", "O/P Response is " + Response);

            JSONArray responseObject = new JSONArray(Response);

                      for(int i=0; i < responseObject.length(); i++)

                {
                    obj = responseObject.getJSONObject(i);


                }
  }
catch(Exception e)
{
 System.out.println(e);
}

}

和,在你的

doInBackground() {
   ....
 CallPageDetails();

}

和,

 onPostExecute() {
                    if(yourListView!=null) {
                  listhashmap = new HashMap<String, Object>();

                    listhashmap.put("text",obj.getString("text"));

            here YOU WILL BE storing the item in arraylist arraylistitems
  &&  also set, 
            yourAdapter.notifyDataSetChanged();
                 }
        .....
        .....


}

*-> 风险自负。

【讨论】:

  • 为什么要自担风险
  • 同样的问题...只有单个数组正在接收
  • 好的,这就是为什么不准确的原因,但尝试在“EndlessAdapters”和“ListView + ScrollView”上进行搜索,祝你好运。
【解决方案6】:

arraylist 保存对象引用,因此您的列表仅保存最后一个值,因为您是同一内存位置上的新对象。

for (int i = 0; i < responseObject.length(); i++) {
    obj = r esponseObject.getJSONObject(i);
    listhashmap = new HashMap < String, Object > ();  // problems code
    listhashmap.put("text", obj.getString("text"));
}

替换为

for (int i = 0; i < responseObject.length(); i++) {
    obj = r esponseObject.getJSONObject(i);
 **HashMap<String, Object> listhashmap = new HashMap<String, Object>();**

                        listhashmap.put("text",obj.getString("text"));

                here i am storing the item in arraylist arraylistitems
                         rraylistitem.put(listhashmap);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多