sergejsha / pinned-section-listview

Easy to use ListView with pinned sections for Android.
2.59k stars 808 forks source link

IndexOutOfBoundsException on deletion #46

Closed nstCactus closed 10 years ago

nstCactus commented 10 years ago

When I try to delete items from the adapter, I sometimes get an IndexOutOfBoundsException, using the latest revision from github.

Here is what I had last time:

ArrayList example:

Position Type
0 Section
1 Item 1
2 Item 2
3 Item 3

Simplified for loop:

for(int i = selectedIds.size() - 1; 0 <= i; i--){
    item = (Item)this.getItem(selectedIds.keyAt(i));
    Log.v("AlarmsListAdapter", String.format("Trying to delete item at position %d.Adapter size = %d", selectedIds.keyAt(i), this.getCount()));
    this.remove(item);
}

Logcat output:

06-09 11:24:04.740  24140-24140/com.zion.htf V/AlarmsListAdapter﹕ Trying to delete item at position 3.Adapter size = 4
06-09 11:24:04.740  24140-24140/com.zion.htf V/AlarmsListAdapter﹕ Trying to delete item at position 2.Adapter size = 3
06-09 11:24:05.030  24140-24140/com.zion.htf E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.zion.htf, PID: 24140
    java.lang.IndexOutOfBoundsException: Invalid index 2, size is 2
            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 com.zion.htf.adapter.AlarmsListAdapter.getItemViewType(AlarmsListAdapter.java:131)
            at com.hb.views.PinnedSectionListView.findFirstVisibleSectionPosition(PinnedSectionListView.java:282)
            at com.hb.views.PinnedSectionListView.ensureShadowForPosition(PinnedSectionListView.java:256)
            at com.hb.views.PinnedSectionListView.recreatePinnedShadow(PinnedSectionListView.java:317)
            at com.hb.views.PinnedSectionListView$2.onChanged(PinnedSectionListView.java:134)
            at android.database.DataSetObservable.notifyChanged(DataSetObservable.java:37)
            at android.widget.BaseAdapter.notifyDataSetChanged(BaseAdapter.java:50)
            at android.widget.ArrayAdapter.notifyDataSetChanged(ArrayAdapter.java:286)
            at android.widget.ArrayAdapter.remove(ArrayAdapter.java:247)
            at com.zion.htf.adapter.AlarmsListAdapter.removeSelected(AlarmsListAdapter.java:248)
            at com.zion.htf.ui.AlarmManagerActivity$1.onActionItemClicked(AlarmManagerActivity.java:70)
            at android.support.v7.internal.view.ActionModeWrapper$CallbackWrapper.onActionItemClicked(ActionModeWrapper.java:138)
            at com.android.internal.policy.impl.PhoneWindow$DecorView$ActionModeCallbackWrapper.onActionItemClicked(PhoneWindow.java:3029)
            at com.android.internal.app.ActionBarImpl$ActionModeImpl.onMenuItemSelected(ActionBarImpl.java:969)
            at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:735)
            at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:152)
            at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:874)
            at com.android.internal.view.menu.ActionMenuView.invokeItem(ActionMenuView.java:546)
            at com.android.internal.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:115)
            at android.view.View.performClick(View.java:4438)
            at android.view.View$PerformClick.run(View.java:18439)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5118)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:611)
            at dalvik.system.NativeStart.main(Native Method)

When I use a ListView instead of a PinnedSectionListView, it works just fine.

andrew-codechimp commented 10 years ago

I've been getting the same on deletions and the random nature of it occurring is making this hard to track down. There's quite a few issues open and I don't know if the owner of this lib is actively working on it any more.

nstCactus commented 10 years ago

Not so sure it is being actively developed as last commit was 6 months ago. But the beauty of open source is that anyone can fork the project and improve it. Unfortunately at the moment I don't have the time...

zaplitny commented 10 years ago

Seems the problem is related to visibleItemCount calculation for ensureShadowForPosition method - it uses getLastVisiblePosition() method. I could fix it by adding position < getCount() check in findFirstVisibleSectionPosition. Not sure if it's correct solution but it works

danikula commented 10 years ago

Same issue #30 and fix for it

sergejsha commented 10 years ago

Thanks for reporting and analysis. It must be fixed now.