如何为不同的内容使用不同的卡片布局?
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);
在我的 RecyclerAdapter
的 onCreate()
方法中调用。 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.Adapter
的onCreateViewHolder
方法中检查视图类型,并inflate相应的视图,然后在onBindViewHolder(ViewHolder, int)
中绑定。
结果是不同内容的卡片布局不同。
使用 CardView
显示卡片的特定布局非常简单。
我已经为我的卡片创建了一个 XML 布局,并使用 LayoutInflater
将该 XML 布局实例化到视图。
更具体地说:
View largeCardView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card_view, viewGroup, false);
在我的 RecyclerAdapter
的 onCreate()
方法中调用。 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.Adapter
的onCreateViewHolder
方法中检查视图类型,并inflate相应的视图,然后在onBindViewHolder(ViewHolder, int)
中绑定。
结果是不同内容的卡片布局不同。