RecyclerView se bloquea al actualizar en la parte superior

Tengo un RecyclerView en mi aplicación todo está funcionando bien estoy mientras se desplaza cuando el último elemento es visible Estoy añadiendo un poco más de artículo a la parte inferior y está funcionando bien. Ahora lo que el problema es que tengo un controlador que se ejecuta después de cada 5 segundos y comprobar si hay alguna actualización en el servicio web y si hay alguna actualización sólo carga los datos a la parte superior de la RecyclerView funciona bien cuando tengo No se desplaza el RecyclerView pero cuando lo desplazo y se llama al Handler (como se llama después de cada 5 segundos), mientras que al actualizar el RecyclerView en la parte superior de la aplicación se bloquea.

Función de actualización en la parte superior:

 public void addOnTop(ArrayList<ItemPOJO> topItemList) { for (int i = topItemList.size() - 1; i >= 0; i--) { itemList.add(0, topItemList.get(i)); } notifyItemRangeInserted(0, topItemList.size()); notifyDataSetChanged(); } 

Este es el registro de errores:

 java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionViewHolder{419b8760 position=5 id=-1, oldPos=-1, pLpos:-1 no parent} at android.support.v7.widget.RecyclerView$Recycler.validateViewHolderForOffsetPosition(RecyclerView.java:4214) at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4345) at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4326) at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1955) at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1364) at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1327) at android.support.v7.widget.LinearLayoutManager.scrollBy(LinearLayoutManager.java:1155) at android.support.v7.widget.LinearLayoutManager.scrollVerticallyBy(LinearLayoutManager.java:1012) at android.support.v7.widget.RecyclerView.scrollByInternal(RecyclerView.java:1363) at android.support.v7.widget.RecyclerView.onTouchEvent(RecyclerView.java:2227) at android.view.View.dispatchTouchEvent(View.java:7190) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2274) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2009) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2280) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2023) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2280) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2023) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2280) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2023) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2280) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2023) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2280) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2023) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2280) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2023) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2280) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2023) at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1931) at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1385) at android.app.Activity.dispatchTouchEvent(Activity.java:2396) 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:1879) at android.view.View.dispatchPointerEvent(View.java:7370) at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3182) at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3127) at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4164) at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4143) at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:4235) at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:171) at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method) at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:163) at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:4214) at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:4254) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725) at android.view.Choreographer.doCallbacks(Choreographer.java:555) at android.view.Choreographer.doFrame(Choreographer.java:523) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreog 

PS: com.android.support:recyclerview-v7:22.2.1 se utiliza

Este bloqueo puede ser causado por el hecho de que los métodos setViewHolder y onBind se están llamando mientras se está actualizando su lista (utilizada por el adaptador), pero notifyDataSetChanged() no se ha llamado. Esto suele suceder si se desplaza por la lista, o fling, mientras se está actualizando la lista.

Mantenga una lista separada ( tempList ) de ItemPOJOs y agregue el topData en esa lista. A continuación, borre la lista utilizada para el adaptador, establezca la lista del adaptador con el tempList y llame a notifyDataSetChanged() .

Es un error de RV, ver la discusión aquí .
En la mayoría de los casos, use notifyDataSetChanged() evitará este bloqueo, pero destruirá Animation y Performance.

Intente inhabilitar recyclerview mientras refresca:

 recyclerView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return true; } }); 

Cambiar el código de esta manera:

 public void addOnTop(ArrayList<ItemPOJO> topItemList) { Collections.reverse(topItemList); itemList.addAll(0, topItemList); notifyItemRangeInserted(0, topItemList.size()); } 

Es raro, pero de esta manera he resuelto mi problema!

Pruebe notifyItemRangeInserted (0, topItemList.size () – 1);

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.