Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


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?

  • Disposición de Android que reemplaza una vista con otra vista en tiempo de ejecución
  • Cómo hacer que una imagen encaje en un marco circular en android
  • ¿Cómo recuperar más de 1000 filas de Parse.com?
  • ¿Cuál es la diferencia entre las API de Google en SDK para Android
  • Android WebView dentro de ScrollView solo desplaza scrollview
  • Android AsyncTasks Cómo comprobar si la actividad aún se está ejecutando
  • OverridePendingTransition para actividades deslizantes dentro y fuera suavemente
  • Cómo crear un archivo de imagen de tarjeta SD para el emulador de Android?
  • El icono de la aplicación no se muestra en la barra de acción
  • El uso de los permisos de Android ACCESS_LOCATION_EXTRA_COMMANDS
  • ¿Hay alguna forma de obtener hash clave de APK firmado?
  • Uso óptimo de BitmapFactory.Options.inSampleSize para la velocidad
  • One Solution collect form web for “RecyclerView, StaggeredGridLayoutManager Actualizar el error”

    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); } } 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.