如何为不同的内容使用不同的卡片布局?

How do I use different card layouts for varying content?

使用 CardView 显示卡片的特定布局非常简单。

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

更具体地说:

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

在我的 RecyclerAdapteronCreate() 方法中调用。 onCreate方法然后returns这个largeCardVew。这非常有效,并且卡片按照它们在 XML 文件中的布局显示。

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

例如,如果我事先知道将有一个字符串传递到卡中的TextView,而这个字符串只能有两个值"Large"和"Small" ,如何使用一种类型的 XML 文件与 "Large" 文本一起使用,而另一种 XML 文件与 "Small" 文本一起使用?

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

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

这类似于您创建单个卡片布局的方式,但不是只有一个 .xml 和一个 ViewHolder,每个布局都需要有自己的 .xml 定义它的文件,以及 ViewHolder class.

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

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

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

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

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