studio - tablas gridview android
gridView con diferentes tamaños de celdas, estilo pinterest (3)
Fondo
GridView es una clase que amplía AdapterView , lo que significa que muestra las celdas en un estilo de cuadrícula de manera eficiente, reciclando vistas antiguas para que se muestren como nuevas cuando el usuario se desplaza.
El problema
A veces, desearía obtener una interfaz de usuario especial, que se parece a la interfaz de usuario de Windows Phone Tiles, que tiene celdas de diferentes tamaños una sobre otra.
Algo como esto:
AABB
AACC
AADD
AADD
cada letra representa una parte de su celda, por lo que la celda A es 2x4, la celda B y la celda C toman 2x1 cada una, y la celda D es 2x2.
Podría ser incluso más que eso, donde la celda D terminó un poco por encima de lo que he mostrado, y justo debajo de ella hay otra celda, por lo que el final de D y el final de A no son necesariamente alineados.
un ejemplo de una aplicación que tiene este estilo es pinterest .
GridView no permite tal cosa.
De hecho, cada solución que he probado tiene problemas. Me gustaría preguntar si hay otras alternativas o mejores soluciones.
Lo que he encontrado
Hay varias formas de manejar este problema:
Como una clase que se extiende, AdapterView GridView tiene la capacidad de tener un tipo para cada elemento (usando BaseAdapter ), lo que le permite establecer cómo diseñar la celda.
Sin embargo, todavía te limita ya que obtendrás filas de elementos, uno debajo del otro. debes tenerlos alineados.
GridLayout es un diseño relativamente nuevo, y es bastante flexible. Google ha publicado una buena biblioteca de compatibilidad para él, que ofrece API7 y superior.
Sin embargo, no utiliza ningún reciclaje de vistas, por lo que es una mala elección en caso de que desee mostrar muchos artículos.
Si tiene muchos elementos, tendrá que crear todas las vistas para ellos.
Biblioteca QuiltView : se extiende desde GridLayout, por lo que básicamente tiene el mismo problema.
StaggeredGridView : parece el más prometedor, pero tiene muchos errores, especialmente cuando cambia de orientación. tales errores incluyen celdas vacías, mal desplazamiento y NPE (raro pero aún sucede). Tampoco estoy seguro si es compatible con tener celdas personalizadas en lugar de solo imageViews.
otras soluciones, como se menciona here .
La pregunta
¿Alguien sabe de otra alternativa a este problema? Tal vez algunas soluciones para cualquiera de las soluciones que he mostrado?
EDITAR: Creo que sobre StaggeredGridView, el desplazamiento y las excepciones se pueden resolver usando un ImageView normal que establece su tamaño dentro de getView. Creo que la razón por la que funciona de una manera extraña es que la muestra actualiza el tamaño de la vista de imagen después de que se cargó desde Internet.
Sin embargo, el problema de las celdas vacías aún permanece en esta biblioteca. no solo eso, sino que sus tamaños cambian mucho, incluso sin cambiar la orientación.
EDITAR: por ahora, creo que la mejor solución es usar la biblioteca PinterestLikeAdapterView .
no tiene ningún problema que pueda encontrar.
sin embargo, no puede hacer que los elementos tomen más de 1 ancho de celda. es muy bueno, sin embargo.
EDITAR: lamentablemente tiene problemas con notifyDataSetChanged. lo he informado here .
¿Es un poco tarde para responder?
mira esta biblioteca desde etsy. parece muy prometedor
https://github.com/etsy/AndroidStaggeredGrid
Creo que es una versión más nueva de https://github.com/maurycyw/StaggeredGridView
.
Actualizado.
Intenta usar RecyclerView StaggeredGridLayoutManager de google en su lugar
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
recyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL));
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setAdapter(adapter);
Creo que un RecyclerView con StaggeredGridLayoutManager puede resolver este problema, y que si también deseas tener un desplazamiento rápido, puedes probar esta biblioteca .
Entonces, no se necesitan más engaños, ya que Google brindó una solución ...
Es posible que pueda lograr esto con un solo ListView, donde cada celda contiene una plantilla de cuadrícula diferente. He hecho algo similar a lo que describes, usando esta técnica. Si los tamaños de celda deben ser únicos, esto no funcionará, pero debería ser suficiente para el caso que describió:
AABB
AACC
AADD
AADD
Al crear un puñado de plantillas como esta, con varios arreglos de A, B, C, D, puede usarlas aleatoriamente como celdas ListView y algunas matemáticas de compensación simple le permitirían a su adaptador poblar cada subcélula para lograr algo como lo siguiente:
AABB
AACC
AADD
AADD
BBBB
ACCC
ADDD
ADDD
AAAA
BBCC
BBCC
DDDD
AABB
AACC
AADD
AADD
AABB
AACC
DDDD
DDDD