Quiero expandir / contraer los elementos de mi recyclerView para mostrar más información. Quiero lograr el mismo efecto de SlideExpandableListView .
Básicamente en mi viewHolder tengo una vista que no es visible y quiero hacer una animación de expansión / colapso suave en lugar de establecer la visibilidad solo en VISIBLE / GONE. Solo necesito expandir un elemento a la vez y sería genial tener algo de elevación para mostrar que el elemento está seleccionado.
Es el mismo efecto de la nueva lista de historial de llamadas recientes de Android. Las opciones "CALL BACK" y "DETAILS" solo son visibles cuando se selecciona un elemento.


Respuestas:
No use ninguna biblioteca para este efecto, en su lugar use la forma recomendada de hacerlo de acuerdo con Google I / O. En el método onBindViewHolder de su recyclerView, haga esto:
Y para los efectos geniales que desea, use estos como sus atributos list_item:
donde comment_background es:
y comment_selection es:
fuente
TransitionManager.beginDelayedTransition(recyclerView);si no puedo hacer la referencia de la vista del reciclador.recyclerViewparámetro como en el constructor del adaptadorPara esto, solo necesitaba líneas simples no complicadas
en su método onBindViewHolder agregue el siguiente código
Para aquellos que desean que solo se expanda un elemento y que otros se colapsen. Utilizar este
primero declare una variable global con previousExpandedPosition = -1
luego
¡¡¡Hecho!!!. Simple y humilde .. :)
fuente
OnClickListeners enonCreateViewHolderlugar deonBindViewHolderRecyclerViewhacer el trabajo, quiero decir, ¿cuál es el sentido de loLayoutManagercontrario si no gestiona los diseños? ¡Esta solución es mejor que la solución más votada ya que tiene menos código, permiteRecyclerViewmanejar las cosas y funciona mejor!No digo que este sea el mejor enfoque, pero parece funcionar para mí.
El código completo se puede encontrar en: Código de ejemplo en: https://github.com/dbleicher/recyclerview-grid-quickreturn
En primer lugar, agregue el área expandida al diseño de su celda / elemento y haga que el diseño de la celda que lo rodea animateLayoutChanges = "true". Esto asegurará que la expansión / colapso esté animada:
Luego, haga que su clase de Adaptador RV implemente View.OnClickListener para que pueda actuar sobre el elemento en el que se hace clic. Agregue un campo int para mantener la posición de la vista expandida e inicialícelo en un valor negativo:
Finalmente, implemente sus métodos ViewHolder, onBindViewHolder () y anule el método onClick (). Expandirá la vista en onBindViewHolder si su posición es igual a "posición expandida" y la ocultará si no. Establece el valor de extendedPosition en el oyente onClick:
Esto debería expandir solo un elemento a la vez, utilizando la animación predeterminada del sistema para el cambio de diseño. Al menos me funciona. Espero eso ayude.
fuente
expandAlarmLa función enAlarmClockFragment.javaarchivos ejecuta la parte de expansión.onClick()debería anular? No hayonClicken el adaptador.Hay una biblioteca muy simple de usar con soporte de gradle: https://github.com/cachapa/ExpandableLayout .
Desde los documentos de la biblioteca:
Después de marcar sus ampliables vistas, simplemente llame a cualquiera de estos métodos en el contenedor:
expand(),collapse()otoggle()fuente
Sé que ha pasado mucho tiempo desde que se publicó la pregunta original. Pero creo que para los lentos como yo, un poco de explicación de la respuesta de @ Heisenberg sería útil.
Declare dos variables en la clase de adaptador como
Luego en onBindViewHolder siguiendo como se indica en la respuesta original.
Y, por último, para obtener el objeto recyclerView en la anulación del adaptador
Espero que esto ayude.
fuente
Simplemente no hay necesidad de usar bibliotecas de terceros. Un pequeño ajuste en el método demostrado en Google I / O 2016 y Heisenberg sobre este tema, es el truco.
Dado que se
notifyDataSetChanged()vuelve a dibujar el completoRecyclerView,notifyDataItemChanged()es una mejor opción (no la mejor) porque tenemos la posición y elViewHoldera nuestra disposición, ynotifyDataItemChanged()solo se vuelve a dibujar lo particularViewHolderen una posición determinada .Pero el problema es que la desaparición prematura del
ViewHolderclic y su aparición no se eliminan aunquenotifyDataItemChanged()se utilicen.El siguiente código no recurre
notifyDataSetChanged()ninotifyDataItemChanged()se prueba en API 23 y funciona de maravilla cuando se usa en un RecyclerView donde cada ViewHolder tiene unCardViewelemento raíz:prev_positiones un entero global inicializado en -1.detailses la vista completa que se muestra cuando se expande y se oculta cuando se contrae.Como se dijo, el elemento raíz de
ViewHolderes unCardViewconforegroundystateListAnimatoratributos definidos exactamente como lo dijo Heisenberg sobre este tema.ACTUALIZACIÓN: La demostración anterior colapsará el elemento previamente expandido si uno de ellos está expandido. Para modificar este comportamiento y mantener el elemento expandido como está, incluso cuando se expande otro elemento, necesitará el siguiente código.
ACTUALIZACIÓN: al expandir los últimos elementos de la lista, es posible que no se muestre completamente porque la parte expandida va debajo de la pantalla. Para obtener el elemento completo dentro de la pantalla, use el siguiente código.
IMPORTANTE: Para que las demostraciones anteriores funcionen, uno debe mantener en su código una instancia de RecyclerView y su LayoutManager (el último para flexibilidad)
fuente
notifyItemChangedporque tengo unaImageViewimagen que carga desde una url.notifyItemChangedrecargar mi imagen hace que se vea raroTransitionManager.beginDelayedTransition(recycler);, gran descubrimiento. Pero descubrí que al usar este método, si hago clic en varias filas secuencialmente, eventualmente desencadena un bloqueo internoThe specified child already has a parent. You must call removeView() on the child's parent first. Me imagino que esto se debe al reciclaje de la vista en los límites de la vista del reciclador, pero no puedo asegurarlo. ¿Alguien tuvo el mismo problema?Después de usar la forma recomendada de implementar elementos expandibles / plegables que residen en elementos expandidos / contraídos
RecyclerViewen RecyclerView respondidos por HeisenBerg , he visto algunos artefactos notables cada vez queRecyclerViewse actualiza invocandoTransitionManager.beginDelayedTransition(ViewGroup)y posteriormentenotifyDatasetChanged().Su respuesta original:
Modificado:
intque realiza un seguimiento del elemento expandidoViewHolderusa durante el colapso del elementoTenga en cuenta que el método
TransitionManager.beginDelayedTransition(ViewGroup)ynotifyDataSetChanged()se reemplazan pornotifyItemChanged(int)un elemento específico de destino y algunos pequeños ajustes.Después de la modificación, los efectos no deseados anteriores deberían desaparecer. Sin embargo, esta puede no ser la solución perfecta. Solo hizo lo que quería, eliminando los ojos.
::EDITAR::
Para aclarar, ambos
mExpandedPositionymExpandedHolderson globales.fuente
notifyItemChanged(). Puede animar y cambiar manualmente la altura del elemento y agregarle vistas.Haga lo siguiente después de configurar el oyente onClick para la clase ViewHolder:
Creo que eso debería ayudar, así es como lo implementé y hace lo mismo que Google hace en la vista de llamadas recientes.
fuente
Me sorprende que aún no haya una respuesta concisa, aunque una animación de expansión / contracción de este tipo es muy fácil de lograr con solo 2 líneas de código:
Juntos con
Entonces, para mí, las explicaciones en el siguiente enlace fueron realmente útiles: https://medium.com/@nikola.jakshic/how-to-expand-collapse-items-in-recyclerview-49a648a403a6
fuente
fuente
Use dos tipos de vista en su
RVAdapter. Uno para el diseño expandido y otro para contraído. Y la magia sucede con la configuraciónandroid:animateLayoutChanges="true"deRecyclerViewCheckout, el efecto logrado usando esto a las 0:42 en este videofuente