2015-10-10 4 views
0

Я отлаживал свое приложение, включив его, и внезапно он разбился без причины. Прошло несколько минут. Обычно это не будет проблемой, так как crashlogs поможет, но на этот раз crashlog бесполезен. Может быть, вы можете увидеть здесь, почему он разбился?Array вне границ в android без причины

java.lang.IndexOutOfBoundsException: Invalid index 302, size is 0 
     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255) 
     at java.util.ArrayList.get(ArrayList.java:308) 
     at android.widget.ArrayAdapter.getItem(ArrayAdapter.java:337) 
     at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:390) 
     at android.widget.ArrayAdapter.getView(ArrayAdapter.java:362) 
     at android.widget.AbsListView.obtainView(AbsListView.java:2347) 
     at android.widget.ListView.makeAndAddView(ListView.java:1864) 
     at android.widget.ListView.fillUp(ListView.java:732) 
     at android.widget.ListView.correctTooHigh(ListView.java:1421) 
     at android.widget.ListView.fillSpecific(ListView.java:1359) 
     at android.widget.ListView.layoutChildren(ListView.java:1651) 
     at android.widget.AbsListView.onLayout(AbsListView.java:2151) 
     at android.view.View.layout(View.java:15671) 
     at android.view.ViewGroup.layout(ViewGroup.java:5038) 
     at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579) 
     at android.widget.FrameLayout.onLayout(FrameLayout.java:514) 
     at android.view.View.layout(View.java:15671) 
     at android.view.ViewGroup.layout(ViewGroup.java:5038) 
     at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579) 
     at android.widget.FrameLayout.onLayout(FrameLayout.java:514) 
     at android.view.View.layout(View.java:15671) 
     at android.view.ViewGroup.layout(ViewGroup.java:5038) 
     at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579) 
     at android.widget.FrameLayout.onLayout(FrameLayout.java:514) 
     at android.view.View.layout(View.java:15671) 
     at android.view.ViewGroup.layout(ViewGroup.java:5038) 
     at android.support.v4.widget.DrawerLayout.onLayout(DrawerLayout.java:1043) 
     at android.view.View.layout(View.java:15671) 
     at android.view.ViewGroup.layout(ViewGroup.java:5038) 
     at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579) 
     at android.widget.FrameLayout.onLayout(FrameLayout.java:514) 
     at android.view.View.layout(View.java:15671) 
     at android.view.ViewGroup.layout(ViewGroup.java:5038) 
     at com.android.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:494) 
     at android.view.View.layout(View.java:15671) 
     at android.view.ViewGroup.layout(ViewGroup.java:5038) 
     at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579) 
     at android.widget.FrameLayout.onLayout(FrameLayout.java:514) 
     at android.view.View.layout(View.java:15671) 
     at android.view.ViewGroup.layout(ViewGroup.java:5038) 
     at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2086) 
     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1843) 
     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1061) 
     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5885) 
     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767) 
     at android.view.Choreographer.doCallbacks(Choreographer.java:580) 
     at android.view.Choreographer.doFrame(Choreographer.java:550) 
     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753) 
     at android.os.Handler.handleCallback(Handler.java:739) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5254) 
     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:903) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

Это, как я добавить адаптер к ListView, что я думаю, что влияет

msgs = new CircularArray<Message>(helper.getAllMessages(), MSG_STACK_SIZE); 
    if (msgs.getSize() > 0){ 
     sortedMessages.clear(); 
     sortedMessages.addAll(msgs.getAllSorted()); 
     createAdapter(); 
    } 
    setListAdapter(adapter); 

sortedMessages поле, которое передается в конструктор адаптера в createAdapter. Я также изменить этот список в качестве слушателя, который вызывается из другого потока:

public void onNewMessage(Message msg) { 
     msgs.add(msg); 
     helper.insertMessage(msg); 

     sortedMessages.clear(); 
     sortedMessages.addAll(msgs.getAllSorted()); 
     ChatFragment.this.getActivity().runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       adapter.notifyDataSetChanged(); 
       setSelection(adapter.getCount() - 1); 
      } 
     }); 
    } 
+0

'java.lang.IndexOutOfBoundsException: недопустимый индекс 302, размер 0'. Что означает «размер ** 0 **»? Может быть, это причина? –

+3

, вы, вероятно, вызываете clear() в коллекции, в то время как адаптер выкладывает свои дочерние элементы. – Blackbelt

+0

Я знаю, что это значит, но его ошибка из ListView, я ничего не могу с этим поделать. – jammaster

ответ

1

кажется, что ArrayList адаптера изменилось в то время как ListView рисует, вы должны вызвать notifyDatasetChanges на адаптере, где список с адаптером изменяется.

Что касается фрагментов кода: , вы не должны обновлять список из нескольких потоков, делать все обновления в списке из потока ui и уведомлять адаптер, как будто вы избежите менять список, пока адаптер получение списка для списка

+0

Я делаю именно это. Но я думаю, что знаю проблему. Я думаю, что я должен сделать изменения в наборе данных в потоке пользовательского интерфейса, так как он не будет одновременно обновлять набор и перерисовывать «ListView» одновременно. – jammaster

Смежные вопросы