gpt4 book ai didi

java - 使用 listView/recyclerView 不同行的不同布局(显示图像或文本)

转载 作者:行者123 更新时间:2023-12-02 10:44:52 25 4
gpt4 key购买 nike

您好,我是 Android 开发新手,目前正在开发我的第一个应用程序。假设现在我从上次 Activity 中获取了一些数据——四个字符串数组列表——药物名称、图像的 URL 链接、颜色、形状。我想在格式中显示这些信息,如下所示: layout

这四列来自四个 arrayList 中的项目。药物的数量取决于数组列表的大小,我想向下滚动以查看每种药物。我想也许使用 recyclerView 来完成这个任务。有两个问题:

  1. 如何自定义每一行,只让一行显示图片,其他行显示文字?我在网上查找,似乎客户适配器自定义了同一布局中的每一行。

  2. 如果每次运行应用程序时药物数量 n 不同,因为它取决于上次 Activity 的结果,如何在 .xml 文件中编写布局?我不能简单地在 .xml 文件中写入固定数量的 ListView。

有人可以给我一些建议吗?非常感谢!

最佳答案

您需要为您正在使用的项目定义 View 类型。

data class MedicineItem(val name, val imageUrl, val viewType)

然后将列表传递到您的适配器

重写适配器中的 getViewItemType() 方法。作为设计,我认为您将需要三种类型的医学项目 View 。第一个是标题,第二个是普通项目,第三个是带有图像的药品项目。

你可以自己定义viewType值,比如我刚刚做的

class Constants {
const val TITLE = 1
const val NORMAL_ITEM = 2
const val IMAGE_ITEM = 3
}

override fun getItemViewType(position: Int): Int {
val item : MedicineItem = list[position]
if(item.viewType == Constants.TITLE)
return Constants.TITLE
else if(item.viewType == Constant.NORMAL_ITEM)
return Constants.NORMAL_ITEM
else if(item.viewType == Constant.NORMAL_ITEM)
return Constants.IMAGE_ITEM
}

对于每个 View 项的不同布局,您需要为每种类型创建三个布局(xml 文件)和三个 ViewHolder 类。然后定义要显示的布局。

首先,在 onCreatViewHolder() 中,决定每个 View 项将使用哪个 ViewHolder。可以看到viewType的返回值。

 override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): RecyclerView.ViewHolder {
if(viewType == Constants.TITLE) {
return MedicineTitleViewHolder()

} else if(viewType == Constants.NORMAL_ITEM) {
return MedicineNormalViewHolder()

} else if(viewType == Constants.IMAGE_ITEM) {
return MedicineIamgeViewHolder()

}

}

最后,现在在onBindViewHolder()中返回每个item的viewholder进行回收,可以看到bind()方法接收的是单个数据,可以传递一个MedicinItem数据对象进行显示。

override fun onBindViewHolder(holder: RecyclerView.ViewHolder?, position: Int) {
if (holder is MedicineTitleViewHolder) {
(holder as MedicineTitleViewHolder).bind(list[position])

} else if(holder as MedicineNormalViewHolder){
(holder as MedicineNormalViewHolder).bind(list[position])

} else if(viewType == Constants.IMAGE_ITEM) {
(holder as MedicineIamgeViewHolder).bind(list[position])

}
}

关于java - 使用 listView/recyclerView 不同行的不同布局(显示图像或文本),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52662435/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com