2016-07-21 15 views
17

Mam RecyclerView, który zawiera listę kart, z których każda rozwija się w karty podrzędne.
Każda karta ma inny tekst. Chcę, aby kiedy użytkownik kliknie na kartę dziecka, rozwinie się, aby pokazać tekst w środku. Wysokość rozwinięcia zależy od ilości tekstu zawartego na karcie.Rozbudowy z Androidem RecyclerView innej wysokości karty

Próbowałem zmierzyć wysokość docelową za pomocą:

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

a następnie rozszerzając kartę zmierzona wysokość (patrz here). Daje jednak tę samą zmierzoną wysokość wszystkim kartom.

Oto mój kod, który jest oparty na this (dokładniej Xamarin version):

Jest to główny Adapter, który tworzy i wiąże się z rodziców i karty dziecka:

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); 
    } 
} 

I myślę, że to jest miejsce, w którym potrzebny jest kod, ale jeśli potrzebujesz jakiegoś innego kodu z innych klas, chętnie go opublikuję. Możesz również zapoznać się z powyższymi linkami, aby dowiedzieć się, jak to działa.

Mam nadzieję, że ktoś może mi pomóc.
Dzięki!

+0

Ustawiasz wysokość poprawki 100 dla każdego dziecka. –

+0

Wiem o tym. To jest wysokość początkowa. Chcę ustawić, aby zawijał treść po kliknięciu karty. Jak mogę to zrobić? – amitairos

+0

spróbuj ustawić wysokość pomiaru dla tego widoku. –

Odpowiedz

7

W końcu udało mi się rozwiązać problem.
Musiałem zmienić sposób mierzony wrap_content wysokość widoku do tego:

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

Reszta jest taka sama.
Dzięki this post.

3

Nie wiem, dlaczego chcesz znaleźć wysokość karty, zamiast tego możesz po prostu owinąć wysokość karty dziecka do wysokości tekstu i uczynić kartę niewidoczną dziecka, gdy tylko użytkownik kliknie kartę, widoczność karty dziecka zostanie odwrócony do widocznego i pojawi się karta z tym samym wzrostem!

+0

Chciałem pokazać karty podrzędne, tylko z niewielką wysokością, a kiedy użytkownik kliknie kartę, rozwija się, aby zawinąć zawartość. To sprawiło, że było to trudne. Zobacz moją ostateczną odpowiedź. W każdym razie dzięki. – amitairos

Powiązane problemy