RecyclerView: Inconsistency detected. Invalid item position

AndroidAndroid LayoutAndroid RecyclerviewIndexoutofboundsexceptionScreen Rotation

Android Problem Overview


Our QA has detected a bug: when rotating the Android device (Droid Turbo), the following RecyclerView-related crash happened:

> java.lang.IndexOutOfBoundsException: > Inconsistency detected. Invalid item position 2(offset:2).state:3

To me, it looks like an internal error inside RecyclerView, as I can't think of any way of this being caused directly by our code...

Has anyone encountered this problem?

What would be the solution?

A brutal workaround could be perhaps to catch the exception when it happens and re-create the RecyclverView instance from scratch, to avoid getting left with a corrupted state.

But, if possible, I would like to understand the problem better (and perhaps fix it at its source), instead of masking it.

The bug is not easy to reproduce, but it is fatal when it happens.

The full stack-trace:

W/dalvikvm( 7546): threadid=1: thread exiting with uncaught exception (group=0x41987d40)
	E/AndroidRuntime( 7546): FATAL EXCEPTION: main
	E/AndroidRuntime( 7546): Process: com.oblong.mezzedroid, PID: 7546
	E/AndroidRuntime( 7546): java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 2(offset:2).state:3
	E/AndroidRuntime( 7546): 	at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:3382)
	E/AndroidRuntime( 7546): 	at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:3340)
	E/AndroidRuntime( 7546): 	at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1810)
	E/AndroidRuntime( 7546): 	at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1306)
	E/AndroidRuntime( 7546): 	at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1269)
	E/AndroidRuntime( 7546): 	at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:523)
	E/AndroidRuntime( 7546): 	at org.liboid.recycler_view.RecyclerViewContainer$LiLinearLayoutManager.onLayoutChildren(RecyclerViewContainer.java:179)
	E/AndroidRuntime( 7546): 	at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:1942)
	E/AndroidRuntime( 7546): 	at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:2237)
	E/AndroidRuntime( 7546): 	at org.liboid.recycler_view.LiRecyclerView.onLayout(LiRecyclerView.java:30)
	E/AndroidRuntime( 7546): 	at android.view.View.layout(View.java:14946)
	E/AndroidRuntime( 7546): 	at android.view.ViewGroup.layout(ViewGroup.java:4651)
	E/AndroidRuntime( 7546): 	at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
	E/AndroidRuntime( 7546): 	at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
	E/AndroidRuntime( 7546): 	at android.view.View.layout(View.java:14946)
	E/AndroidRuntime( 7546): 	at android.view.ViewGroup.layout(ViewGroup.java:4651)
	E/AndroidRuntime( 7546): 	at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
	E/AndroidRuntime( 7546): 	at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
	E/AndroidRuntime( 7546): 	at android.view.View.layout(View.java:14946)
	E/AndroidRuntime( 7546): 	at android.view.ViewGroup.layout(ViewGroup.java:4651)
	E/AndroidRuntime( 7546): 	at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)
	E/AndroidRuntime( 7546): 	at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525)
	E/AndroidRuntime( 7546): 	at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
	E/AndroidRuntime( 7546): 	at com.oblong.mezzedroid.workspace.content.bins.BinsContainerLayout.onLayout(BinsContainerLayout.java:22)
	E/AndroidRuntime( 7546): 	at android.view.View.layout(View.java:14946)
	E/AndroidRuntime( 7546): 	at android.view.ViewGroup.layout(ViewGroup.java:4651)
	E/AndroidRuntime( 7546): 	at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)
	E/AndroidRuntime( 7546): 	at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525)
	E/AndroidRuntime( 7546): 	at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
	E/AndroidRuntime( 7546): 	at android.view.View.layout(View.java:14946)
	E/AndroidRuntime( 7546): 	at android.view.ViewGroup.layout(ViewGroup.java:4651)
	E/AndroidRuntime( 7546): 	at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
	E/AndroidRuntime( 7546): 	at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
	E/AndroidRuntime( 7546): 	at android.view.View.layout(View.java:14946)
	E/AndroidRuntime( 7546): 	at android.view.ViewGroup.layout(ViewGroup.java:4651)
	E/AndroidRuntime( 7546): 	at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
	E/AndroidRuntime( 7546): 	at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
	E/AndroidRuntime( 7546): 	at android.view.View.layout(View.java:14946)
	E/AndroidRuntime( 7546): 	at android.view.ViewGroup.layout(ViewGroup.java:4651)
	E/AndroidRuntime( 7546): 	at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)
	E/AndroidRuntime( 7546): 	at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525)
	E/AndroidRuntime( 7546): 	at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
	E/AndroidRuntime( 7546): 	at android.view.View.layout(View.java:14946)
	E/AndroidRuntime( 7546): 	at android.view.ViewGroup.layout(ViewGroup.java:4651)
	E/AndroidRuntime( 7546): 	at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
	E/AndroidRuntime( 7546): 	at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
	E/AndroidRuntime( 7546): 	at android.view.View.layout(View.java:14946)
	E/AndroidRuntime( 7546): 	at android.view.ViewGroup.layout(ViewGroup.java:4651)
	E/AndroidRuntime( 7546): 	at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)
	E/AndroidRuntime( 7546): 	at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525)
	E/AndroidRuntime( 7546): 	at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
	E/AndroidRuntime( 7546): 	at android.view.View.layout(View.java:14946)
	E/AndroidRuntime( 7546): 	at android.view.ViewGroup.layout(ViewGroup.java:4651)
	E/AndroidRuntime( 7546): 	at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
	E/AndroidRuntime( 7546): 	at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
	E/AndroidRuntime( 7546): 	at android.view.View.layout(View.java:14946)
	E/AndroidRuntime( 7546): 	at android.view.ViewGroup.layout(ViewGroup.java:4651)
	E/AndroidRuntime( 7546): 	at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2132)
	E/AndroidRuntime( 7546): 	at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1872)
	E/AndroidRuntime( 7546): 	at andro

Android Solutions


Solution 1 - Android

I had a (possibly) related issue - entering a new instance of an activity with a RecyclerView, but with a smaller adapter was triggering this crash for me.

RecyclerView.dispatchLayout() can try to pull items from the scrap before calling mRecycler.clearOldPositions(). The consequence being is that it was pulling items from the common pool that had positions higher than the adapter size.

Fortunately, it only does this if PredictiveAnimations are enabled, so my solution was to subclass GridLayoutManager (LinearLayoutManager has the same problem and 'fix'), and override supportsPredictiveItemAnimations() to return false :

/**
 * No Predictive Animations GridLayoutManager
 */
private static class NpaGridLayoutManager extends GridLayoutManager {
	/**
	 * Disable predictive animations. There is a bug in RecyclerView which causes views that
	 * are being reloaded to pull invalid ViewHolders from the internal recycler stack if the
	 * adapter size has decreased since the ViewHolder was recycled.
	 */
	@Override
	public boolean supportsPredictiveItemAnimations() {
		return false;
	}

	public NpaGridLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
		super(context, attrs, defStyleAttr, defStyleRes);
	}

	public NpaGridLayoutManager(Context context, int spanCount) {
		super(context, spanCount);
	}

	public NpaGridLayoutManager(Context context, int spanCount, int orientation, boolean reverseLayout) {
		super(context, spanCount, orientation, reverseLayout);
	}
}

Solution 2 - Android

In my case (delete/insert data in my data structure) I needed to clear recycle pool and then notify data set changed!

mRecyclerView.getRecycledViewPool().clear(); mAdapter.notifyDataSetChanged();

Solution 3 - Android

Use notifyDataSetChanged() instead notifyItem... in this case.

Solution 4 - Android

I had the same issue with RecyclerView So I just notified the adapter about data set change right after the list cleared.

mList.clear();
mAdapter.notifyDataSetChanged();

mList.addAll(newData);
mAdapter.notifyDataSetChanged();

Solution 5 - Android

This error occur when the list in adapter clear when user scrolling which make position of item holder changing, lost ref between list and item on ui, error happen in next "notifyDataSetChanged" request.

Fix:

Review your update list method. If you do something like

mainList.clear();
...
mainList.add() or mainList.addAll()
...
notifyDataSetChanged();

===> Error occur

How to fix. Create new list object for buffer processing and assign again to main list after that

List res = new ArrayList();
…..
res.add();  //add item or modify list
….
mainList = res;
notifyDataSetChanged();

Thanks to Nhan Cao for this great help :)

Solution 6 - Android

I solved this by delaying the mRecycler.setAdapter(itemsAdapter) till after adding all the items to the adapter with mRecycler.addAll(items) and it worked. No idea why i did that to begin with, it was from a library's code that I looked over and saw those lines in the "wrong order", I'm pretty sure this is it though, please if someone can confirm it explain why it's so? Not sure if this is a valid answer even

Solution 7 - Android

I had a similar problem but not exactly the same. In my case at 1 point I was clearing the array that was passed to the recyclerview

mObjects.clear();

and not calling notifyDataSetChanged, as I did not want the recyclerview to immediately clear the views. I was re-filling the mObjects array in AsyncTask.

Solution 8 - Android

I have same issue .It was occur when I was scrolling fast and calling API and updating data.After trying all things to prevent crash , I found solution.

mRecyclerView.stopScroll();

It will work.

Solution 9 - Android

I am altering data for the RecyclerView in the background Thread. I got the same Exception as the OP. I added this after changing data:

myRecyclerView.post(new Runnable() {
    @Override
    public void run() {
        myRecyclerAdapter.notifyDataSetChanged();
    }
});

Hope it helps

Solution 10 - Android

For me, it worked after adding this line of code:

mRecyclerView.setItemAnimator(null);

Solution 11 - Android

In my case, I was updating the items and calling notifyDataSetChanged in a non-UI thread. Most of the time it worked, but when a lot of changes happened quickly, it'd crash. When I did, instead, basically

activity.runOnUiThread(new Runnable() {
    @Override
    public void run() {
        changeData();
        notifyDataSetChanged();
    }
});

then it stopped crashing.

Solution 12 - Android

My problem went away after I modified my Adapter implementation to use a copy of the items array instead of a reference. The setItems() method is called each time we have new items to show in the RecyclerView.

Instead of:

private class MyAdapter extends RecyclerView.Adapter<ItemHolder> {
     private List<MyItem> mItems;  

    (....)

    void setItems(List<MyItem> items) {
        mItems = items;
    }
}

I did:

void setItems(List<MyItem> items) {
    mItems = new ArrayList<>(items);
}

Solution 13 - Android

This is only solution which worked for me even trying many from above solutions.

1.) Intilization

CustomAdapter scrollStockAdapter = new CustomAdapter(mActivity, new ArrayList<StockListModel>());
list.setAdapter(scrollStockAdapter);
scrollStockAdapter.updateList(stockListModels);

2.) Write this method in adapter

public void updateList(List<StockListModel> list) {
stockListModels.clear();
stockListModels.addAll(list);
notifyDataSetChanged();
}

stockListModels -> this list is which you are using in adapter .

Solution 14 - Android

I've faced with the same situation. And it was solved by adding codes before you clear your collection.

mRecyclerView.getRecycledViewPool().clear();

Solution 15 - Android

In my case I just removed line with setHasStableIds(true);

Solution 16 - Android

You only need to clear your list on OnPostExecute() and not while doing Pull to Refresh

// Setup refresh listener which triggers new data loading
        swipeContainer.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                 
                AsyncTask<String,Void,String> task = new get_listings();
                task.execute(); // clear listing inside onPostExecute

            }
        });

I discovered that this happens when you scroll during a pull to refresh, since I was clearing the list before the async task , resulting to java.lang.IndexOutOfBoundsException: Inconsistency detected.

        swipeContainer.setRefreshing(false);
        //TODO : This is very crucial , You need to clear before populating new items 
        listings.clear();

That way you won't end with an inconsistency

Solution 17 - Android

Using ListAdapter (androidx.recyclerview.widget.ListAdapter) call adapter.submitList(null) before calling adapter.submitList(list):

adapter.submitList(null)
adapter.submitList(someDataList)

Solution 18 - Android

extends LinearLayoutManager and catch this error

public class NoCrashLinearLayoutManager extends LinearLayoutManager {

    public NoCrashLinearLayoutManager(Context context) {
        super(context);
    }

    public NoCrashLinearLayoutManager(Context context, int orientation, boolean reverseLayout) {
        super(context, orientation, reverseLayout);
    }

    public NoCrashLinearLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    @Override
    public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
        try {
            super.onLayoutChildren(recycler, state);
        } catch (IndexOutOfBoundsException e){
            e.printStackTrace();
        }
    }
}

Solution 19 - Android

It also can be related with setting the adapter multiple times at the same time. I had a callback method which was triggered 5-6 times at the same time and I was setting the adapter in that callback so RecycledViewPool couldn't handle with all of those datas contemporaneously. It's a fat chance but you better check it out anyway.

Solution 20 - Android

Use

notifyDataSetChanged()

instead

notifyItemRangeInserted(0, YourArrayList.size())

in this case.

Solution 21 - Android

For fix this issue just call notifyDataSetChanged() with empty list before updating recycle view.

For example

//Method for refresh recycle view

    if (!hcpArray.isEmpty())

hcpArray.clear();//The list for update recycle view

adapter.notifyDataSetChanged();

Solution 22 - Android

In my case I was trying to change my adapter contents on a background thread but called notify on the main/ui thread.*

That is not possible! The reason why notify is forced to main thread is that the recyclerview wants you to edit your backing adapter on the main thread, even on the same call stack.

To solve the problem make sure that every operation to your adapter as well as every notify... call is made on the ui/main thread!

Solution 23 - Android

I ran into this nasty stack trace with the new Android Architecture Components recently. Essentially, I have a list of items in my ViewModel that are observed by my Fragment, using LiveData. When the ViewModel posts a new value for the data, the Fragment updates the adapter, passing in these new data elements and notifying the adapter that there have been changes.

Unfortunately, when passing in the new data elements to the adapter, I failed to account for the fact that both the ViewModel and the Adapter would be pointing to the same object reference! Meaning that if I update the data and call postValue() from within the ViewModel, there's a very small window where the data could be updated and the adapter not yet notified!

My fix was to instantiate a fresh copy of the elements when passed in to the adapter:

mList = new ArrayList<>(passedList);

With this super easy fix you can be ensured your adapter data will not change until right before your adapter is notified.

Solution 24 - Android

This exception raised on API 19, 21 (but not new). In Kotlin coroutine I loaded data (in background thread) and in UI thread added and showed them:

adapter.addItem(item)

Adapter:

var list: MutableList<Item> = mutableListOf()

init {
    this.setHasStableIds(true)
}

open fun addItem(item: Item) {
    list.add(item)
    notifyItemInserted(list.lastIndex)
}

For some reason Android doesn't render quick enough or something else, so, I update a list in post method of the RecyclerView (add, remove, update events of items):

view.recycler_view.post { adapter.addItem(item) }

This exception is similar to "Cannot call this method in a scroll callback. Scroll callbacks mightbe run during a measure & layout pass where you cannot change theRecyclerView data. Any method call that might change the structureof the RecyclerView or the adapter contents should be postponed tothe next frame.": https://stackoverflow.com/questions/42944005/recyclerview-cannot-call-this-method-in-a-scroll-callback.

Solution 25 - Android

You can reproduce this crash in the following way

  1. Clear adapter items list.clear(). (Do not call notify*** methods)
  2. Scroll recycler view.

So I assume this crash happens when you remove items from the list and scroll without calling notify methods

Solution 26 - Android

this problem may happen when you try clearing your list, if you are going to clear your data list especially when you are using pull to refresh try to use a boolean flag, initialize it as false and inside OnRefresh method make it true, clear your dataList if flag is true just before adding the new data to it and after that make it false.

your code might be like this

 private boolean pullToRefreshFlag = false ;
 private ArrayList<your object> dataList ;
 private Adapter adapter ;

 public class myClass extend Fragment implements SwipeRefreshLayout.OnRefreshListener{

 private void requestUpdateList() {

     if (pullToRefresh) {
        dataList.clear
        pullToRefreshFlag = false;
     }

     dataList.addAll(your data);
     adapter.notifyDataSetChanged;


 @Override
 OnRefresh() {
 PullToRefreshFlag = true
 reqUpdateList() ; 
 }

}

Solution 27 - Android

I had a same issue previously. Finally found a workaround for that

What i do is to notify adapter that item has removed and then notify adapter data set range changed

 public void setData(List<Data> dataList) {
      if (this.dataList.size() > 0) {
          notifyItemRangeRemoved(0, dataList.size());
          this.dataList.clear();
      }
      this.dataList.addAll(dataList)
      notifyItemRangeChanged(0, dataList.size());

 }

Solution 28 - Android

I ran into a similar issue and just figured it out. I hard-coded a few examples for a test case but didn't ensure they each returned a unique ID and that caused the below crash for me. Fixing the IDs resolved the issue, hope this helps someone else!

Solution 29 - Android

i once got the error too:

Cause: I was trying to update a Recycler View from an Async task while simultaneously trying to get old deleted viewHolders;

Code: I generate data at the press of a button, logic as follows

  1. Clear the last items in the recycler view
  2. Call async task to generate data
  3. OnPostExecute Update the Recycler view and NotifyDataSetChanged

Problem: Whenever i scroll fast before generating my data i get

>Inconsistency detected. Invalid view holder adapter positionViewHolder >java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 20(offset:2).state:3

Solution: instead of clearing the RecyclerView before generating my data, i instead leave it and then Replace it with the New Data, the Call NotifyDatasetChanged, as shown below;

       @Override
        protected void onPostExecute(List<Objects> o) {
            super.onPostExecute(o);
            recyclerViewAdapter.setList(o);
            mProgressBar.setVisibility(View.GONE);
            mRecyclerView.setVisibility(View.VISIBLE);
        }

Solution 30 - Android

Lint gave me an advice concerning inconsistency: I wrote (onBindViewHolder()):

pholder.mRlayout.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        doStuff(position);
                    }
                });

which had to be replaced by :

pholder.mRlayout.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        doStuff(pholder.getAdapterPosition());
                    }
                });

Run both codes in your code and then run Lint for the full explaination!!

Solution 31 - Android

Just remove all views of your layout Manager before notify. like:

myLayoutmanager.removeAllViews();

Solution 32 - Android

I've just fixed the same issue. I had a RecyclerView.Adapter with setHasStableIds(true) set to avoid items blinking.

I was using a duplicatable field in getItemId() (my model has no id field):

override fun getItemId(position: Int): Long {
    // Error-prone due to possibly duplicate name.
    return contacts[position].name.hashCode().toLong()
}

getItemId() should return a unique id for each item, so the solution was to do it:

override fun getItemId(position: Int): Long {
    // Contact's phone is unique, so I use it instead.
    return contacts[position].phone.hashCode().toLong()
}

Solution 33 - Android

Updated RecyclerView to newest 1.2.1 version. Aaand Magic happend! Couldn't break my app anymore :) So.. try to replace old version number with the newest one in your gradle file

dependencies {
    ...
    // RecyclerView
    def recyclerview_version = "1.2.1"
    implementation "androidx.recyclerview:recyclerview:$recyclerview_version"
}

Solution 34 - Android

I found that setting mRecycler.setLayoutFrozen(true); in the onRefresh method of the swipeContainer.

solved the problem for me.

swipeContainer.setOnRefreshListener(new   SwipeRefreshLayout.OnRefreshListener() {
		@Override
		public void onRefresh() {
			orderlistRecycler.setLayoutFrozen(true);
			loadData(false);

		}
	});

Solution 35 - Android

This is quite a nasty bug.

To handle my item click, I used an implementation of the RecyclerView.OnItemTouchListener similar to the solution found in this question.

After many times of refreshing the RecyclerView's datasource and clicking an item, this IndexOutOfBoundsException would crash my application. When an item is clicked, the RecyclerView internally goes looking for the correct underlying view and gives back it position. Checking out the source code, I saw that there were some Tasks and Threads scheduled. To cut the story short, basically it's just some illegal state where two datasources are intermixed and not synchronized and the whole thing goes wild.

Based on this, I removed my implementation of the RecyclerView.OnItemTouchListener and simply caught the click on the ViewHolder of the Adapter myself:

public void onBindViewHolder (final BaseContentView holder, final int position) {

    holder.itemView.setOnClickListener(new OnClickListener() {

      @Override
      public void onClick (View view) {

        // do whatever you like here
      }
    });

}

This might not be the best solution, but a crash-free on for now.. Hopefully this will save you some time :).

Solution 36 - Android

add_location.removeAllViews();

            for (int i=0;i<arrayList.size();i++)
            {
                add_location.addView(new HolderDropoff(AddDropOffActivtity.this,add_location,arrayList,AddDropOffActivtity.this,this));
            }
            add_location.getAdapter().notifyDataSetChanged();

Solution 37 - Android

Sorry For late but perfect solution: when you try to remove a specific item just call notifydatasetchange() and get these item in bindviewholder and remove that item and add again to the last of list and then chek list position if this is last index then remove item. basically the problem is come when you try to remove item from the center. if you remove item from last index then there have no more recycling and also your adpter count are mantine (this is critical point crash come here) and the crash is solved the code snippet below .

 holder.itemLayout.setVisibility( View.GONE );//to hide temprory it show like you have removed item
       
        Model current = list.get( position );
        list.remove( current );
        list.add( list.size(), current );//add agine to last index
        if(position==list.size()-1){// remove from last index
             list.remove( position );
        }

Solution 38 - Android

Very late response, but this may help someone on the feature.

Make sure that your onStop or onPause methods aren't clearing any of your lists

Solution 39 - Android

The problem occured on me when I had not recoginized I did call two times with different threads simultaneously .

> notifyDataSetChanged

one from sqlite load function one from after calling function

Solution 40 - Android

One way I managed to fix this (in a Kotlin app with architecture components) was by setting if (recyclerView.adapter == null) recyclerView.adapter = MyAdapter(datasource) after I fetched the data from the Repository. Apparently it might have something to do with async issues with the suspend functions in the repository because when I fetch data for the first time when starting the activity, it calls the REST API since there is no data in the db, and everything goes smoothly, but after that, that same query cannot be made again, causing a crash.

Solution 41 - Android

In my case I got this exception

> java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionViewHolder

None of the answers above are worked in my case. Because I was updating/changing an existing item in the adapter but I used

myAdapter.notifyItemInserted(position)

Instead, I should use this

myAdapter.notifyItemChanged(position)

Note: We should use notifyItemInserted() when we insert an item and we should use notifyItemChanged() when we update an item in the adapter.

Solution 42 - Android

Most of the answers are disabling animations or creating new copies of data which is an overkill in my opinion. They do work but they don't address the root cause of the issue. In my case it was due to using DiffUtils in a wrong way. In the areItemsTheSame(old, new) method I did not properly implement the equality check, that, in turn cased the adapter to be notified by notifyItemRangeInserted() even though the same number of items are in the new list. So pay close attention to how you implement the DiffUtils callbacks!

Solution 43 - Android

If notifyItemChanged(int position), notifyItemInserted(int position) Use instead of each other This problem occurs when you want to update the item use notifyItemChanged and when you want to add the item use notifyItemInserted

Solution 44 - Android

If you have more than one recycler views sharing the same adapter, then this error pops-up so to avoid this error create separate adapters for those recycler views. This makes the recycler view to have unshared pools which stops the adapters to populate them when not required.

Solution 45 - Android

One possible reason for this crash.

Reloading data while recyclerview is still scrolling.

So, try recyclerview.stopScroll() before reloading your data again.

Solution 46 - Android

I solved the issue, adding items one by one when it gets new data. I use this function inside adapter.

public void add(Data item) {
        if(!params.contains(item){
           params.add(item);
           notifyItemInserted(getItemCount() - 1);
        }
    }
}

Solution 47 - Android

in my case , this solve my issue

rv.setAdapter(null);
rv.setItemAnimator(null);

PS: my problem ocur when i do seache filter in my recyclerview adapter

Solution 48 - Android

If anyone is having the same issue, I overrided these two methods in my adapter, it worked perfectly.

        override fun getItemId(position: Int): Long {
            return position.toLong()
        }
    
        override fun getItemViewType(position: Int): Int {
            return position
        }

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionKarolDepkaView Question on Stackoverflow
Solution 1 - AndroidKas HuntView Answer on Stackoverflow
Solution 2 - AndroidMatejCView Answer on Stackoverflow
Solution 3 - AndroidKhai NguyenView Answer on Stackoverflow
Solution 4 - AndroidRezaView Answer on Stackoverflow
Solution 5 - AndroidRamesh PokharelView Answer on Stackoverflow
Solution 6 - AndroidOdaymView Answer on Stackoverflow
Solution 7 - AndroidAalapView Answer on Stackoverflow
Solution 8 - AndroidAnand SavjaniView Answer on Stackoverflow
Solution 9 - Androidkashyap jimuliyaView Answer on Stackoverflow
Solution 10 - AndroidFatih GeeView Answer on Stackoverflow
Solution 11 - AndroidErhannisView Answer on Stackoverflow
Solution 12 - AndroidMiguel A. GabrielView Answer on Stackoverflow
Solution 13 - AndroidRamkesh YadavView Answer on Stackoverflow
Solution 14 - AndroidMagicDroidXView Answer on Stackoverflow
Solution 15 - AndroiddarkchaosView Answer on Stackoverflow
Solution 16 - AndroidFahadView Answer on Stackoverflow
Solution 17 - AndroidBigStView Answer on Stackoverflow
Solution 18 - AndroidRickon GaoView Answer on Stackoverflow
Solution 19 - AndroidMustafa GüvenView Answer on Stackoverflow
Solution 20 - AndroidPankaj TalaviyaView Answer on Stackoverflow
Solution 21 - AndroidEKNView Answer on Stackoverflow
Solution 22 - AndroidJohannes MuenichsdorferView Answer on Stackoverflow
Solution 23 - AndroidSteveView Answer on Stackoverflow
Solution 24 - AndroidCoolMindView Answer on Stackoverflow
Solution 25 - AndroidShamsView Answer on Stackoverflow
Solution 26 - AndroidMoaz HView Answer on Stackoverflow
Solution 27 - AndroidChengView Answer on Stackoverflow
Solution 28 - AndroidDocBotView Answer on Stackoverflow
Solution 29 - AndroidLekeOpeView Answer on Stackoverflow
Solution 30 - AndroidRodolphe CalvetView Answer on Stackoverflow
Solution 31 - AndroidBaBaX RaView Answer on Stackoverflow
Solution 32 - AndroidYamashiro RionView Answer on Stackoverflow
Solution 33 - AndroidAndrijView Answer on Stackoverflow
Solution 34 - AndroidMark SheekeyView Answer on Stackoverflow
Solution 35 - AndroidDroidBenderView Answer on Stackoverflow
Solution 36 - AndroidManish SharmaView Answer on Stackoverflow
Solution 37 - AndroidIrfan UllahView Answer on Stackoverflow
Solution 38 - Androidjust aguyView Answer on Stackoverflow
Solution 39 - AndroidUcdemirView Answer on Stackoverflow
Solution 40 - AndroidOzzyTheGiantView Answer on Stackoverflow
Solution 41 - AndroidShailendra MaddaView Answer on Stackoverflow
Solution 42 - AndroidabduView Answer on Stackoverflow
Solution 43 - Androidemad pirayeshView Answer on Stackoverflow
Solution 44 - AndroidTom ShawView Answer on Stackoverflow
Solution 45 - AndroidSailesh LimbuView Answer on Stackoverflow
Solution 46 - AndroidCésar CoboView Answer on Stackoverflow
Solution 47 - Androidhamil.DevView Answer on Stackoverflow
Solution 48 - AndroidCHARFEDDINE AmineView Answer on Stackoverflow