【问题标题】:How do I use different card layouts for varying content?如何为不同的内容使用不同的卡片布局?
【发布时间】:2016-02-24 02:00:51
【问题描述】:

在使用CardView 时,为卡片显示某种布局非常简单。

我为我的卡片创建了一个 XML 布局,并使用 LayoutInflater 将该 XML 布局实例化到视图。

更具体地说:

View largeCardView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card_view, viewGroup, false);

在我的RecyclerAdapteronCreate() 方法中调用。然后onCreate 方法返回这个largeCardVew。这可以完美运行,并且卡片会按照 XML 文件中的布局显示。

但是如果我想为不同的内容显示不同的卡片怎么办?是否可以为不同的事物显示不同的卡片,但它们都在同一个RecyclerView

例如,如果我事先知道卡中会有一个字符串传入TextView,而这个字符串只能有“Large”和“Small”两个值,我该如何使用一种类型的与“大”文本一起使用的 XML 文件,以及与“小”文本一起使用的另一个 XML 文件?

这是一个例子(取自Google Play):

正如您在图片中看到的,有两种不同的卡片类型,具有不同的布局(忽略橙色按钮)。有没有办法实现类似的事情,并且卡片在同一个RecyclerView

【问题讨论】:

标签: java android xml android-layout android-cardview


【解决方案1】:

这与创建单个卡片布局的方式类似,但不是有一个 .xml 和一个 ViewHolder,每个布局都需要有自己的自己的 .xml 文件定义它,还有一个 ViewHolder 类。

发现非常重要的方法是 RecyclerView.Adapter 类中的getItemViewType(int position) 方法。默认情况下,此方法返回 0,假设正在使用 viewType 的单个布局(在本例中为 cardView)。由于需要不止一种类型,因此我必须定义它们。

然后我创建了一个整数数组(称为cardViewTypes),定义了哪些布局用于哪种类型的数据。由于您应该已经拥有卡片内容的某种数据集(无论是 List 还是 HashMap),因此确保数据与视图类型匹配非常重要。

在我的例子中,我想要有 4 种不同的卡片布局,所以我在它们自己的 .xml 文件中定义了每一个,并给了它们唯一的名称。然后,在我的 RecyclerView.Adapter 类中,我创建了一个单独的类,它为每个布局扩展了 ViewHolder。我确保viewType 数组中的每个整数都与我的数据匹配,并调用了getItemViewType

然后我在RecyclerView.AdapteronCreateViewHolder方法中检查视图类型,并膨胀对应的视图,然后绑定到onBindViewHolder(ViewHolder, int)中。

结果是不同内容的卡片布局不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-04
    • 1970-01-01
    • 2011-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多