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?

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: 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: Diseño incorrecto

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: Resultado de diseño correcto

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); } } 
  • NestedScrollView y Horizontal RecyclerView Smooth Scrolling
  • RecyclerView eliminar el bug de animación
  • Cómo persistir grandes datos RecyclerView en los cambios de orientación?
  • Implementar una barra de acción contextual para reciclar
  • NestedScrolling con NestedScrollView, RecyclerView (Horizontal), dentro de un CoordinatorLayout
  • Efecto de rebote en RecyclerView
  • Añadir elementos a Endless Scroll RecyclerView con ProgressBar en la parte inferior
  • No hay buen ejemplo sobre RecyclerView y StaggeredGridLayoutManager en Documentos de Android
  • Lista de desplazamiento vertical y horizontal o cuadrícula en Android
  • Deslice RecyclerVista arriba mientras lo desliza hacia arriba, o deslice la vista de reciclaje hacia abajo mientras desliza hacia abajo
  • El rollo no funciona correctamente para RecyclerView dentro de CoordinatorLayout
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.