davideas / FlexibleAdapter

Fast and versatile Adapter for RecyclerView which regroups several features into one library to considerably improve the user experience :-)
Apache License 2.0
3.55k stars 548 forks source link

v5.0.0-b4: Inconsistency detected issue with showAllHeaders() method. #54

Closed noundla closed 8 years ago

noundla commented 8 years ago

Hi @davideas

Thanks for great lib.

I am using FlexibleAdapter to display sticky headers in RecyclerView. It is working fine for the first time loading list data using adapter, however, I am getting below crash issue while pushing fresh list items in adapter for the second time onwards.

Below is my code.

Code in onCreateView() method:

mRecyclerView = (RecyclerView) view.findViewById(R.id.recycler_view);
        mRecyclerView.setLayoutManager(new SmoothScrollLinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false));

        //mRecyclerView.setHasFixedSize(true); //Size of RV will not change
        mRecyclerView.setItemAnimator(new DefaultItemAnimator() {
            @Override
            public boolean canReuseUpdatedViewHolder(RecyclerView.ViewHolder viewHolder) {
                //NOTE: This allows to receive Payload objects on notifyItemChanged called by the Adapter!!!
                return true;
            }
        });
        mRecyclerView.addItemDecoration(new DividerItemDecoration(getContext(), R.drawable.divider));

code in refreshData() method:(which will be called everytime when user want to refresh data)

ArrayList<AbstractFlexibleItem> items = new ArrayList<AbstractFlexibleItem>();
.....
......
add AbstractFlexibleItem objects(headers and simple items) to items.
....
.......
mAdapter = new FeedAdapter(items, FeedFragment.this);
mAdapter.setRemoveOrphanHeaders(false);
mRecyclerView.setAdapter(mAdapter);
mAdapter.showAllHeaders();
mAdapter.enableStickyHeaders(3);

Note: FeedAdapter extends FlexibleAdapter

I am not observing the crash issue while commenting showAllHeaders() method call, however, no headers are showing due to this.

Can you please help me to get out of this issue?


E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.code, PID: 23833
java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 15(offset:21).state:21
  at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4405)
  at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4363)
  at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1961)
  at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1370)
  at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1333)
  at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:562)
  at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:2864)
  at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3071)
  at android.view.View.layout(View.java:15140)
  at android.view.ViewGroup.layout(ViewGroup.java:4866)
  at android.widget.FrameLayout.layoutChildren(FrameLayout.java:515)
  at android.widget.FrameLayout.onLayout(FrameLayout.java:450)
  at android.view.View.layout(View.java:15140)
  at android.view.ViewGroup.layout(ViewGroup.java:4866)
  at android.support.v4.view.ViewPager.onLayout(ViewPager.java:1627)
  at android.view.View.layout(View.java:15140)
  at android.view.ViewGroup.layout(ViewGroup.java:4866)
  at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1888)
  at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1742)
  at android.widget.LinearLayout.onLayout(LinearLayout.java:1651)
  at android.view.View.layout(View.java:15140)
  at android.view.ViewGroup.layout(ViewGroup.java:4866)
  at android.widget.FrameLayout.layoutChildren(FrameLayout.java:515)
  at android.widget.FrameLayout.onLayout(FrameLayout.java:450)
  at android.view.View.layout(View.java:15140)
  at android.view.ViewGroup.layout(ViewGroup.java:4866)
  at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1888)
  at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1742)
  at android.widget.LinearLayout.onLayout(LinearLayout.java:1651)
  at android.view.View.layout(View.java:15140)
  at android.view.ViewGroup.layout(ViewGroup.java:4866)
  at android.widget.FrameLayout.layoutChildren(FrameLayout.java:515)
  at android.widget.FrameLayout.onLayout(FrameLayout.java:450)
  at android.view.View.layout(View.java:15140)
  at android.view.ViewGroup.layout(ViewGroup.java:4866)
  at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1888)
  at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1742)
  at android.widget.LinearLayout.onLayout(LinearLayout.java:1651)
  at android.view.View.layout(View.java:15140)
  at android.view.ViewGroup.layout(ViewGroup.java:4866)
  at android.widget.FrameLayout.layoutChildren(FrameLayout.java:515)
  at android.widget.FrameLayout.onLayout(FrameLayout.java:450)
  at android.view.View.layout(View.java:15140)
  at android.view.ViewGroup.layout(ViewGroup.java:4866)
  at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2342)
  at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2048)
  at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1211)
  at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6282)
  at android.view.Choreographer$CallbackRecord.run(Choreographer.java:788)
  at android.view.Choreographer.doCallbacks(Choreographer.java:591)
  at android.view.Choreographer.doFrame(Choreographer.java:560)
  at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:774)
  at android.os.Handler.handleCallback(Handler.java:808)
  at android.os.Handler.dispatchMessage(Handler.java:103)
  at android.os.Looper.loop(Looper.java:193)
  at android.app.ActivityThread.main(ActivityThread.java:5341)
  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:825)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:641)
E/NativeCrypto: ssl=0x60990e98 cert_verify_callback x509_store_ctx=0x61259940 arg=0x0
E/NativeCrypto: ssl=0x60990e98 cert_verify_callback calling verifyCertificateChain authMethod=ECDHE_RSA
davideas commented 8 years ago

Hi @noundla, in the refreshData() you shouldn't recreate the adapter and so reinitialize the RV. Look my example app (dev branch) and you will discover that if you simply call updateDataSet(items) the list will be refreshed cleaner, also the headers will be automatically re-displayed if before they were:

public void updateDataSet(List<T> items) {
    mItems = items;
    notifyDataSetChanged();
    showAllHeaders();
}

Try it by calling that method and let me know.

noundla commented 8 years ago

Thanks :) It worked. I will check out dev branch for other things.