h6ah4i / android-advancedrecyclerview

RecyclerView extension library which provides advanced features. (ex. Google's Inbox app like swiping, Play Music app like drag and drop sorting)
https://advancedrecyclerview.h6ah4i.com/
Apache License 2.0
5.32k stars 860 forks source link

Changing the data for the expandable recycler view throws ClassCastException on item click #77

Closed elod91 closed 9 years ago

elod91 commented 9 years ago

java.lang.ClassCastException: com.acar.adapters.PoisAdapter$PoiChildViewHolder cannot be cast to com.acar.adapters.PoisAdapter$PoiGroupViewHolder at com.acar.adapters.PoisAdapter.onCheckCanExpandOrCollapseGroup(PoisAdapter.java:29) at com.h6ah4i.android.widget.advrecyclerview.expandable.ExpandableRecyclerViewWrapperAdapter.onTapItem(ExpandableRecyclerViewWrapperAdapter.java:597) at com.h6ah4i.android.widget.advrecyclerview.expandable.RecyclerViewExpandableItemManager.handleActionUpOrCancel(RecyclerViewExpandableItemManager.java:311) at com.h6ah4i.android.widget.advrecyclerview.expandable.RecyclerViewExpandableItemManager.onInterceptTouchEvent(RecyclerViewExpandableItemManager.java:247) at com.h6ah4i.android.widget.advrecyclerview.expandable.RecyclerViewExpandableItemManager$1.onInterceptTouchEvent(RecyclerViewExpandableItemManager.java:120) at android.support.v7.widget.RecyclerView.dispatchOnItemTouchIntercept(RecyclerView.java:1986) at android.support.v7.widget.RecyclerView.onInterceptTouchEvent(RecyclerView.java:2027) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1960) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2405) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2106) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2405) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2106) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2405) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2106) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2405) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2106) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2405) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2106) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2405) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2106) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2405) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2106) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2405) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2106) at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2369) at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1719) at android.app.Activity.dispatchTouchEvent(Activity.java:2742) at android.support.v7.internal.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:59) at android.support.v7.internal.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:59) at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2330) at android.view.View.dispatchPointerEvent(View.java:8666) at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4123) at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3989) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3544) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3597) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3563) at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3680) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3571) at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3737) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3544) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3597) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3563) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3571) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3544) at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5807) at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.ja

After I have my new data list, I recreate everything like this:

private void reInitList(List poiAndPartnerCategories) { mLayoutManager = new LinearLayoutManager(this);

    mRecyclerViewExpandableItemManager = new RecyclerViewExpandableItemManager(null);

    final PoisAdapter poisAdapter = new PoisAdapter(this, this, poiAndPartnerCategories, mRecyclerViewExpandableItemManager, this);

    mWrappedAdapter = mRecyclerViewExpandableItemManager.createWrappedAdapter(poisAdapter);      

    final GeneralItemAnimator animator = new RefactoredDefaultItemAnimator();

    animator.setSupportsChangeAnimations(false);

    drawerList.setLayoutManager(mLayoutManager);
    drawerList.setAdapter(mWrappedAdapter);  
    drawerList.setItemAnimator(animator);
    drawerList.setHasFixedSize(false);
    drawerList.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST));
}
elod91 commented 9 years ago

I have a search option in my app and that's why I need to add new data to the adapter. Usually the new data list has less elements, less groups.

h6ah4i commented 9 years ago

Maybe, RecyclerViewExpandableItemManager.release() method call is missing.

RecyclerViewExpandableItemManager class uses RecyclerView.OnItemTouchListener internally and unregister it when the release() method is called.

FYI: If possible, I recommend you to implement setData() or sort of method to your adapter instead of re-creating everything.

elod91 commented 9 years ago

Sorry, I've implemented already a setData() method and it works. All I needed to do is to change the data list and call the notifyDataSetChanged(). A colleague of mine sad that it won't work this way, so that's why I recreated everything. Then after a few hours of suffering I tried the "traditional" method and it worked!