RecyclerView, StaggeredGridLayoutManager Actualizar el error
He utilizado la biblioteca de soporte v7-21 y el RecyclerView
no se muestra correctamente. GridLayoutManager
y LinearLayoutManager
está bien. Problema sólo se produce cuando en StaggeredGridLayoutManager
I Cargar mi DataSet
y, a continuación, actualizar los datos. La actualización de datos funciona bien, pero la vista de RecyclerView
existe fuera de la pantalla.
¿Alguien sabe cómo solucionarlo?
- ¿Cómo puedo llenar RecyclerView con GridLayoutManager de derecha a izquierda
- Seleccionar todas las casillas de verificación en RecyclerView
- Cómo mostrar la fecha entre conversación en recyclerview o en listview
- RecyclerView se bloquea al desplazarse
- Cómo obtener un contexto en un adaptador de vista de reciclador
- Definición de onclickListener de RecyclerView en una actividad
- Cómo poner RecyclerView dentro de NestedScrollView?
- Transición personalizada de elementos compartidos en la actividad final
- Android Horizontal Recycler Ver desplazamiento Dirección
- Efecto de ondulación sobre un elemento de RecyclerView que contiene ImageView
- Desplazamiento del foco de RecyclerView
- Detener elementos de moverse cuando se utiliza StaggeredGridLayoutManager
- Recyclerview con múltiples temporizadores de cuenta regresiva causa parpadeo
Actualizado el 2015-01-04 (en la parte inferior)
Tengo un ejemplo de proyecto para demostrar esto en https://github.com/dbleicher/recyclerview-grid-quickreturn . Pero aquí hay algunos más detalles que pueden ayudarle.
Cuando agrega o elimina un elemento a RecyclerView, debe llamar a notifyItemInserted / notifyItemRemoved para que el adaptador le diga al administrador de diseño que reajuste las vistas afectadas. Por ejemplo, en el adaptador:
public void addItemAtPosition(int position, String item) { myDataset.add(position, item); mAdapter.notifyItemInserted(position); }
Si llama a este método para agregar una vista y la vista está en pantalla, SGLM parece funcionar como se espera, insertando y ajustando el diseño. Si, sin embargo, está viendo la parte superior de la lista y agrega el elemento en la posición cero, la vista se crea fuera de la pantalla (y no lo verá). Puede desplazarse a esta vista con este código siguiente:
public void addItemAtPosition(int position, String item) { myDataset.add(position, item); mAdapter.notifyItemInserted(position); mSGLM.scrollToPosition(position); }
Hay (IMHO) un error en StaggeredGridLayoutManager que se revela con la adición de elementos "fuera de la pantalla". Según los comentarios de yiğit boyar en este hilo https://plus.google.com/u/1/111532428576115387787/posts/6xxayUBz2iV
"… si un elemento se agrega fuera de los límites, el gestor de diseño no le importa"
Y aquí es donde aparece el error. Con SGLM, existe un problema de sincronización con el momento en que se produce el reajuste. En mi código de ejemplo (enlace anterior) tengo un ItemDecorator que añade margen a los ítems más arriba para que no queden oscurecidos por la barra de herramientas. Cuando se utiliza el código anterior, el diseño conserva incorrectamente este margen en el elemento que se mueve hacia abajo en la pantalla cuando se insertan los nuevos elementos. Gorrón.
Aquí está el diseño antes de añadir en la parte superior:
Aquí está el diseño que demuestra el error después de agregar un elemento en la parte superior:
Hay una solución, pero algo derrota el propósito de usar un RecyclerView. Básicamente, si acaba de llamar a notifyDataSetChanged después de agregar / quitar, esto hará caso de SGLM para invalidar su diseño completo. Esto no es óptimo desde una perspectiva de eficiencia, pero sí resulta en un diseño adecuado. Utilizando el código siguiente:
public void addItemAtPosition(int position, String item) { myDataset.add(position, item); mAdapter.notifyDataSetChanged(); // Should NOT do this, but it works! mSGLM.scrollToPosition(position); }
Resultará en el diseño apropiado posterior a la adición:
Espero que esto ayude.
Actualización: 2014-01-04
Como se señala en los comentarios, otra solución es llamar a invalidateItemDecorations () en el recyclerview después de realizar el inserto. En este momento, parece que hacerlo inmediatamente después de insertar ignorará esta llamada (posiblemente porque un pase de disposición ya está en ejecución). Si uno difiere brevemente la llamada, parece que funciona:
public void addItemAtPosition(int position, String item) { myDataset.add(position, item); mAdapter.notifyItemInserted(position); mSGLM.scrollToPosition(position); // Items added to the top row? Better invalidate the decorator. // Delay to ensure that the previous layout pass has completed. if (position < columnCount) { new Handler().postDelayed(new Runnable() { @Override public void run() { mRecycler.invalidateItemDecorations(); } }, 300); } }
- Ruta de archivo SDCard externa para Android
- ¿Cuándo ocurre onCreateOptionsMenu en una actividad activada con ActionBar?