tutorial lesson icon example java android android-layout xamarin xamarin.android

lesson - set border jpanel java



Recycler Expandible de AndroidVer altura de tarjeta diferente (2)

Tengo un RecyclerView que contiene una lista de tarjetas, cada una de las cuales se expande en tarjetas secundarias.
Cada tarjeta tiene un texto diferente. Quiero que cuando el usuario haga clic en una tarjeta secundaria, se expandirá para mostrar el texto en su interior. La altura de expansión se basa en la cantidad de texto que contiene la tarjeta.

Intenté medir la altura del objetivo usando:

view.Measure(ViewGroup.LayoutParams.WrapContent, ViewGroup.LayoutParams.WrapContent);

Y luego expandiendo la tarjeta a la Altura medida (ver here ). Sin embargo, da la misma altura medida a todas las cartas.

Aquí está mi código, que se basa en this (más específicamente la versión de Xamarin ):

Este es el adaptador principal, que crea y enlaza las tarjetas principal y secundaria:

public class HalachaExpandableAdapter : ExpandableRecyclerAdapter<HalachaParentViewHolder, HalachaChildViewHolder>, View.IOnClickListener { LayoutInflater _inflater; bool expand; int targetHeight; bool wave = false; public HalachaExpandableAdapter(Context context, List<IParentObject> itemList) : base(context, itemList) { _inflater = LayoutInflater.From(context); } public override void OnBindChildViewHolder(HalachaChildViewHolder childViewHolder, int position, object childObject) { var halachaChild = (HalachaChild)childObject; childViewHolder.halachaChildTitle.Text = halachaChild.Title.ToString(); targetHeight = childViewHolder.halachaChildCard.Height; childViewHolder.halachaChildCard.LayoutParameters.Height = 100; childViewHolder.halachaChildCard.SetOnClickListener(this); expand = childViewHolder.expand; } public override void OnBindParentViewHolder(HalachaParentViewHolder parentViewHolder, int position, object parentObject) { var halacha = (HalachaItem)parentObject; parentViewHolder._halachaTitleTextView.Text = halacha.Title(); parentViewHolder._halachaContentTextView.Text = halacha.Content; if (halacha.ChildObjectList.Count == 1) wave = true; } public void OnClick(View v) { if (v.Height == 100) { AnimationCollapse anim = new AnimationCollapse(v, targetHeight, 100); anim.Duration = 300; v.StartAnimation(anim); expand = false; } else { AnimationCollapse anim = new AnimationCollapse(v, 100, v.Height); anim.Duration = 300; v.StartAnimation(anim); expand = true; } } public override HalachaChildViewHolder OnCreateChildViewHolder(ViewGroup childViewGroup) { var view = _inflater.Inflate(Resource.Layout.halachotListItem, childViewGroup, false); return new HalachaChildViewHolder(view); } public override HalachaParentViewHolder OnCreateParentViewHolder(ViewGroup parentViewGroup) { var view = _inflater.Inflate(Resource.Layout.halachotListHeader, parentViewGroup, false); wave = false; return new HalachaParentViewHolder(view); } }

Creo que aquí es donde se necesita hacer el código, pero si necesita alguno de los otros códigos de las otras clases, con mucho gusto los publicaré. También puede consultar los enlaces anteriores para ver cómo funciona esto.

Espero que alguien pueda ayudarme.
¡Gracias!


Finalmente logré resolver el problema.
Necesitaba cambiar la forma en que medía la altura de wrap_content de la vista a esto:

v.Measure(MeasureSpec.MakeMeasureSpec(v.Width, MeasureSpecMode.Exactly), MeasureSpec.MakeMeasureSpec(ViewGroup.LayoutParams.WrapContent, MeasureSpecMode.AtMost));

El resto es el mismo.
Gracias a this post.


No sé por qué desea encontrar la altura de la tarjeta, en lugar de eso, puede simplemente ajustar la altura de las tarjetas secundarias a la del texto y hacer que la tarjeta sea invisible, tan pronto como el usuario haga clic en una tarjeta, la visibilidad de la tarjeta secundaria se cambiará ¡Aparecerá una tarjeta visible con su texto con la misma altura!