java - Android Expandable RecyclerView 不同卡片高度

标签 java android android-layout xamarin xamarin.android

我有一个包含卡片列表的 RecyclerView,每个卡片都展开为子卡片。
每张卡片都有不同的文字。我希望当用户点击子卡时,它会展开以显示里面的文本。扩展高度取决于卡片包含的文本量。

我尝试使用以下方法测量目标高度:

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

然后将卡片扩展到测量高度(参见 here)。 但是,它为所有卡片提供了相同的测量高度。

这是我的代码,它基于 this (更具体地说是 Xamarin version ):

这是主适配器,它创建并绑定(bind)父卡和子卡:

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

我认为这是需要完成代码的地方,但是如果您需要其他类的一些其他代码,我会很乐意发布它们。您还可以查看上面的链接以了解其工作原理。

希望有人可以帮助我。
谢谢!

最佳答案

我终于设法解决了这个问题。
我需要将测量 View 的 wrap_content 高度的方式更改为:

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

其余的都是一样的。
感谢 this发帖。

关于java - Android Expandable RecyclerView 不同卡片高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38511006/

相关文章:

java - Spring boot session.enableFilter 导致 AssertionFailure : table not found

java - 如何在 Firebase 中使子级可扩展并为其添加值?

Java 大文件上传抛出 java.io.IOException : Map failed

android - LinearLayout 中具有相同权重的两个 View

php - 如何将从 MySQL 检索到的数据插入到 Android 应用程序中的数组中?

android,如何从另一个 .xml 文件加载 linearlayout?

java - 阵列中奇怪的双重打印

android - 如何以稳定准确的方式读取Android加速度计值?

java - 如何在 LibGDX View 上方放置 admob 广告

android - 布局验证不同于加载程序 android Studio