Android Expandable RecyclerПросмотр различной высоты карты

У меня есть RecyclerView, содержащий список карточек, каждая из которых раскрывается в дочерние карточки.
Каждая карточка имеет разный текст. Я хочу, чтобы когда пользователь нажимал на дочернюю карту, она расширялась, чтобы показать текст внутри. Высота раскрытия зависит от того, сколько текста содержит карточка.

Я попытался измерить высоту цели, используя:

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

А затем разверните карту до измеренной высоты (см. здесь). Однако он дает одинаковую Измеренную высоту для всех карт.

Вот мой код, основанный на этом (точнее, на версия Xamarin):

Это основной адаптер, который создает и связывает родительскую и дочернюю карты:

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

Я думаю, что именно здесь нужно сделать код, но если вам нужен какой-то другой код других классов, я с удовольствием их опубликую. Вы также можете посмотреть ссылки выше, чтобы узнать, как это работает.

Надеюсь, кто-нибудь сможет мне помочь.
Спасибо!


person amitairos    schedule 21.07.2016    source источник
comment
Вы устанавливаете фиксированную высоту 100 для каждого дочернего элемента.   -  person Asif Patel    schedule 21.07.2016
comment
Я знаю это. Это начальная высота. Я хочу настроить его на перенос содержимого при нажатии карты. Как я могу это сделать?   -  person amitairos    schedule 21.07.2016
comment
попробуйте установить для него высоту измерения дочернего элемента.   -  person Asif Patel    schedule 21.07.2016
comment
Это то, что я сделал, как указано в вопросе. Однако он измерял одинаковую высоту для всех дочерних представлений.   -  person amitairos    schedule 21.07.2016


Ответы (2)


Наконец-то мне удалось решить проблему.
Мне нужно было изменить способ измерения высоты представления wrap_content следующим образом:

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

В остальном то же самое.
Благодаря этот пост.

person amitairos    schedule 24.07.2016

Я не знаю, почему вы хотите найти высоту карты, вместо этого вы можете просто обернуть высоту дочерних карт высотой текста и сделать дочернюю карту невидимой, как только пользователь щелкнет карту, видимость дочерней карты будет повернута к видимым, и появится карточка с текстом той же высоты!

person Yash Agrawal    schedule 24.07.2016
comment
Я хотел показать дочерние карточки, только с небольшой высотой, и когда пользователь нажимает на карточку, она расширяется, чтобы обернуть содержимое. Вот что делало это сложным. Смотрите мой окончательный ответ. В любом случае спасибо. - person amitairos; 24.07.2016