为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

喵喔喔 2021-10-28 14:06:13
您好,我是 android 开发的新手,目前正在开发我的第一个应用程序。假设现在我从上一个活动中获得了一些数据——四个字符串数组列表——药物名称、图像的 URL 链接、颜色、形状。我想在格式中显示这些信息,如下所示:四列来自四个数组列表中的项目。药物的数量取决于 arrayLists 的大小,我想向下滚动以查看每种药物。我在想也许可以使用 recyclerView 来实现这一点。有两个问题:如何自定义每一行以让仅一行显示图像而其他行显示文本?我在网上查找,似乎客户适配器以相同的布局自定义每一行。如果每次运行应用程序时药物数量 n 不同,如何在 .xml 文件中编写布局,因为它取决于上次活动的结果?我不能简单地在 .xml 文件中写入固定数量的 ListView。有人能给我一些建议吗?非常感谢!
查看完整描述

3 回答

?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

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


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]) 


    }

}


查看完整回答
反对 回复 2021-10-28
?
饮歌长啸

TA贡献1951条经验 获得超3个赞

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



查看完整回答
反对 回复 2021-10-28
?
浮云间

TA贡献1829条经验 获得超4个赞

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


查看完整回答
反对 回复 2021-10-28
  • 3 回答
  • 0 关注
  • 211 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信