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.recyclerView
pará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
OnClickListener
s enonCreateViewHolder
lugar deonBindViewHolder
RecyclerView
hacer el trabajo, quiero decir, ¿cuál es el sentido de loLayoutManager
contrario si no gestiona los diseños? ¡Esta solución es mejor que la solución más votada ya que tiene menos código, permiteRecyclerView
manejar 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
expandAlarm
La función enAlarmClockFragment.java
archivos ejecuta la parte de expansión.onClick()
debería anular? No hayonClick
en 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 elViewHolder
a nuestra disposición, ynotifyDataItemChanged()
solo se vuelve a dibujar lo particularViewHolder
en una posición determinada .Pero el problema es que la desaparición prematura del
ViewHolder
clic 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 unCardView
elemento raíz:prev_position
es un entero global inicializado en -1.details
es la vista completa que se muestra cuando se expande y se oculta cuando se contrae.Como se dijo, el elemento raíz de
ViewHolder
es unCardView
conforeground
ystateListAnimator
atributos 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
notifyItemChanged
porque tengo unaImageView
imagen que carga desde una url.notifyItemChanged
recargar 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
RecyclerView
en RecyclerView respondidos por HeisenBerg , he visto algunos artefactos notables cada vez queRecyclerView
se actualiza invocandoTransitionManager.beginDelayedTransition(ViewGroup)
y posteriormentenotifyDatasetChanged()
.Su respuesta original:
Modificado:
int
que realiza un seguimiento del elemento expandidoViewHolder
usa 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
mExpandedPosition
ymExpandedHolder
son 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"
deRecyclerView
Checkout, el efecto logrado usando esto a las 0:42 en este videofuente