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:
- Cómo ampliar el espacio entre RecyclerView Item mientras se desplaza
- ¿Cómo ajustar correctamente el valor de elevación a recyclerview?
- RecyclerView expandible cardView
- RecyclerView no se desplaza hacia abajo
- RecyclerView causa problemas al reciclar
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
- ¿Cómo desplazar el RecyclerView de forma programática por unos píxeles específicos?
- Cómo obtener clics en RecyclerView (NO los niños)
- RecyclerView onCreateViewHolder Tipo de devolución Incompatibilidad con varias vistas personalizadas ViewHolders
- Adjuntar TextView a RecyclerView
- Android FlowLayout como RecyclerView LayoutManager
- Los elementos de RecyclerView cambian de tamaño después de la actualización
- Cómo hacer un indicador de página para reciclaje horizontal
- La vista de Recycler no se desplaza correctamente después de implementar el desplazamiento para actualizar el diseño.
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);