Estoy tratando de trabajar con la nueva RecyclerView
, pero no pude encontrar un ejemplo de una RecyclerView
con diferentes tipos de filas / vistas de tarjeta infladas.
Con ListView
anulo el getViewTypeCount
y getItemViewType
, para manejar diferentes tipos de filas.
¿Se supone que debo hacerlo de la manera "antigua" o debería hacer algo LayoutManager
? Me preguntaba si alguien podría señalarme en la dirección correcta. Porque solo puedo encontrar ejemplos con un tipo.
Quiero tener una lista de tarjetas ligeramente diferentes. ¿O debería usar un scrollView
con cardViews
dentro ... hacerlo sin el adaptador y recyclerView
?
Respuestas:
Sin embargo, manejar la lógica de filas / secciones similar a UITableView de iOS no es tan simple en Android como en iOS, cuando usa RecyclerView: la flexibilidad de lo que puede hacer es mucho mayor.
Al final, se trata de cómo averiguar qué tipo de vista está mostrando en el Adaptador. Una vez que lo hayas resuelto, debería ser fácil navegar (en realidad no, pero al menos lo tendrás ordenado).
El adaptador expone dos métodos que debe anular:
La implementación predeterminada de este método siempre devolverá 0, lo que indica que solo hay 1 tipo de vista. En su caso, no es así, por lo que necesitará encontrar una manera de afirmar qué fila corresponde a qué tipo de vista. A diferencia de iOS, que maneja esto para usted con filas y secciones, aquí solo tendrá un índice en el que confiar, y deberá usar sus habilidades de desarrollador para saber cuándo una posición se correlaciona con un encabezado de sección, y cuándo se correlaciona con Una fila normal.
Necesitas anular este método de todos modos, pero generalmente las personas simplemente ignoran el parámetro viewType. Según el tipo de vista, deberá inflar el recurso de diseño correcto y crear su titular de vista en consecuencia. RecyclerView manejará el reciclaje de diferentes tipos de vista de una manera que evite el choque de diferentes tipos de vista.
Si planea usar un LayoutManager predeterminado, como
LinearLayoutManager
, debería estar listo. Si planea hacer su propia implementación de LayoutManager, deberá trabajar un poco más duro. La única API con la que realmente tiene que trabajar es lafindViewByPosition(int position)
que proporciona una vista determinada en una posición determinada. Dado que probablemente querrá diseñarlo de manera diferente según el tipo de vista que tenga, tiene algunas opciones:Por lo general, cuando usa el patrón ViewHolder, establece la etiqueta de la vista con el titular de la vista. Puede usar esto durante el tiempo de ejecución en el administrador de diseño para averiguar qué tipo de vista es agregando un campo en el titular de la vista que expresa esto.
Dado que necesitará una función que determine qué posición se correlaciona con qué tipo de vista, también podría hacer que este método sea accesible globalmente de alguna manera (¿tal vez una clase singleton que gestione los datos?), Y luego simplemente puede consultar el mismo método de acuerdo con la posición.
Aquí hay una muestra de código:
Aquí hay una muestra de cómo deberían ser estos titulares de vistas:
Por supuesto, este ejemplo supone que ha construido su fuente de datos (myData) de una manera que facilita la implementación de un adaptador de esta manera. Como ejemplo, le mostraré cómo construiría una fuente de datos que muestre una lista de nombres y un encabezado cada vez que cambie la primera letra del nombre (suponga que la lista está alfabetizada), de forma similar a cómo un contacto la lista se vería así:
Este ejemplo viene a resolver un problema bastante específico, pero espero que le brinde una buena visión general sobre cómo manejar diferentes tipos de filas en un reciclador y le permita realizar las adaptaciones necesarias en su propio código para satisfacer sus necesidades.
fuente
names[i].substring(0, 1)
onCreateViewHolder
que nos ayudará a crear el titular de la vista. Para obtener más detalles, puede consultar mi parte: stackoverflow.com/questions/47245398/…El truco es crear subclases de ViewHolder y luego emitirlos.
Y luego, en tiempo de ejecución, haga algo como esto:
Espero eso ayude.
fuente
Según la gran respuesta de Gil, resolví Anulando getItemViewType como lo explicó Gil. Su respuesta es excelente y debe marcarse como correcta. En cualquier caso, agrego el código para alcanzar el puntaje:
En su adaptador de reciclador:
Al hacer esto, puede establecer cualquier diseño personalizado para cualquier fila.
fuente
Es bastante complicado pero demasiado difícil, solo copie el código a continuación y listo
disfruta !!!!
fuente
Podemos lograr una vista múltiple en RecyclerView único desde abajo: -
Dependencias en Gradle, así que agregue el siguiente código: -
RecyclerView en XML
Código de actividad
Primer XML
Segundo XML
Tercer XML
Ahora es el momento de hacer el adaptador y esto es principal para mostrar una vista -2 diferente en la misma vista del reciclador, así que compruebe este código completamente: -
Puede consultar también este enlace para obtener más información.
fuente
Tienes que implementar el
getItemViewType()
método enRecyclerView.Adapter
. Por defecto, laonCreateViewHolder(ViewGroup parent, int viewType)
implementaciónviewType
de este método devuelve0
. En primer lugar, necesita ver el tipo de elemento en la posición a los efectos de ver el reciclaje y para eso debe anular elgetItemViewType()
método en el que puede pasar,viewType
lo que devolverá su posición del elemento. Código de ejemplo se da a continuaciónfuente
getItemViewType (int position) es la clave
Cómo hacerlo ?
Puede crear una
RecyclerView
con cualquier cantidad de Vistas diferentes (ViewHolders). Pero para una mejor legibilidad tomemos un ejemplo deRecyclerView
con dosViewholders
.Recuerde estos 3 simples pasos y estará listo para comenzar.
getItemViewType(int position)
ViewType
método inCreateViewHolder ()Vista de poblado basada en el
onBindViewHolder()
método itemViewTypeAquí hay un fragmento de código para ti
Código GitHub:
Aquí hay un proyecto donde he implementado un RecyclerView con múltiples ViewHolders.
fuente
Simplemente puede devolver ItemViewType y usarlo. Ver el código a continuación:
fuente
Puede usar la biblioteca: https://github.com/vivchar/RendererRecyclerViewAdapter
Para cada elemento, debe implementar un ViewRenderer, ViewHolder, SomeModel:
ViewHolder: es un titular de vista simple de vista de reciclador.
SomeModel: es su modelo con
ItemModel
interfazPara más detalles puedes mirar documentaciones.
fuente
Puede usar esta biblioteca:
https://github.com/kmfish/MultiTypeListViewAdapter (escrito por mí)
Adaptador de instalación:
Para cada línea de pedido:
fuente