猿问

使用 listView/recyclerView 对不同行进行不同布局(显示图像或文本)

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

四列来自四个数组列表中的项目。药物的数量取决于 arrayLists 的大小,我想向下滚动以查看每种药物。我在想也许可以使用 recyclerView 来实现这一点。有两个问题:

  1. 如何自定义每一行以让仅一行显示图像而其他行显示文本?我在网上查找,似乎客户适配器以相同的布局自定义每一行。

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

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


喵喔喔
浏览 212回答 3
3回答

一只萌萌小番薯

您需要为正在使用的项目定义视图类型。data class MedicineItem(val name, val imageUrl, val viewType)然后将列表传递到您的适配器覆盖适配器中的 getViewItemType() 方法。作为设计,我认为您需要三种类型的医学项目视图。第一个是标题,第二个是普通项目,第三个是带有图像的药物项目。你可以自己定义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}对于每个视图项的不同布局,您需要为每种类型创建三个布局(xml 文件)和三个 ViewHolder 类。然后定义将显示的布局。首先,在 onCreatViewHolder() 中,决定每个视图项将使用哪个 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])     }}

饮歌长啸

我认为您需要在回收站视图中创建一个回收站视图。您只需要创建包含 Medicine No 和另一个回收者视图的父回收者视图的项目布局文件。然后,您需要为包含可变数量药物的内部回收站视图创建项目布局文件。这回答了您的第 2 部分。

浮云间

RecyclerView::Adapter 有一个方法 getItemViewType(position),你可以覆盖它并返回不同的视图类型。在 createViewHolder(viewType) 中,您可以根据视图类型创建不同的视图。
随时随地看视频慕课网APP

相关分类

Java
我要回答