gpt4 book ai didi

具有 2 种 View 类型的 kotlin recyclerview

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

在每第 5 个项目之后,我想要加载一个按钮 View 。

    override fun getItemViewType(position: Int): Int {

if (position % 5 == 0 && position != 0) {
return R.layout.button10th
} else {
return R.layout.checkitout
}
}

当我运行它时,它带走了我的第 5 个项目。我怎样才能在不拿走我的任何阵列项目的情况下实现这一目标?我需要修复我的 getItemCount 吗?

   override fun getItemCount(): Int {

return lists.size
}

我希望它看起来像下面这样。 1.约翰 2.迈克 3.克里斯 4.简 5.起诉 6. 可点击按钮

最佳答案

我发现最简单的方法是关联一个 modelViewHolder这是什么意思。

我的方法的工作原理是消除何时填充每个 ViewHolder 的决定。从适配器到我们的元素列表。

假设我们想要显示一个名称列表,并且每第 5 个项目我们想要显示一个广告(只是一个例子,它可以是任何东西)

val elements = listOf("Name #1", "Name #2", "Name #3", "Name #4", AdModel("our ad"), "Name #5")

现在在适配器内部,我们首先说我们扩展了泛型 ViewHolderRecyclerView.Adapter<RecyclerView.ViewHolder>() .

之后,我们要覆盖 3 个方法。

获取项目 View 类型

这里我们将决定与每个 model 关联的布局文件。我们将使用实例检查来做到这一点,并根据类型返回我们想要显示的布局文件。

override fun getItemViewType(position: Int): Int {
val element = elements[position] // assuming your list is called "elements"

return when (element) {
is String -> R.layout.name_layout_file

is AdModel -> R.layout.ad_layout_file

else -> throw IllegalArgumentException("Unsupported type") // in case populated with a model we don't know how to display.
}
}

onCreateViewHolder

您需要创建一个 ViewHolder您要显示的每种类型的类。

 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val inflater = LayoutInflater.from(parent.context)

return when (viewType) {
R.layout.name_layout_file -> NameViewHolder(inflater.inflate(viewType, parent, false))

R.layout.ad_layout_file -> AdViewHolder(inflater.inflate(viewType, parent, false))

else -> throw IllegalArgumentException("Unsupported layout") // in case populated with a model we don't know how to display.
}
}

onBindViewHolder

在这里我们可以很容易地转换我们的ViewHolder

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
val element = elements[position] // assuming your list is called "elements"

when (holder) {
is NameViewHolder -> {
val name = element as String
// bind NameViewHolder
}

is AdViewHolder -> {
val adModel = element as AdModel
// bind AdViewHolder
}

}
}

您的完整适配器应如下所示:

class SampleAdapter(val elements: List<Any>) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val inflater = LayoutInflater.from(parent.context)

return when (viewType) {
R.layout.name_layout_file -> NameViewHolder(inflater.inflate(viewType, parent, false))

R.layout.ad_layout_file -> AdViewHolder(inflater.inflate(viewType, parent, false))

else -> throw IllegalArgumentException("Unsupported layout") // in case populated with a model we don't know how to display.
}
}

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
val element = elements[position] // assuming your list is called "elements"

when (holder) {
is NameViewHolder -> {
val name = element as String
// bind NameViewHolder
}

is AdViewHolder -> {
val adModel = element as AdModel
// bind AdViewHolder
}

}
}

override fun getItemViewType(position: Int): Int {
val element = elements[position] // assuming your list is called "elements"

return when (element) {
is String -> R.layout.name_layout_file

is AdModel -> R.layout.ad_layout_file

else -> throw IllegalArgumentException("Unsupported type") // in case populated with a model we don't know how to display.
}
}
}

当您加载适配器时,您将其与多类型列表一起加载,一切正常。

最大的优势是您不受特定类型的限制,添加更多 View 类型非常容易。

但是,如果您想保存所有这些工作,我编写了一个库,该库使用注释处理在编译时生成单/多类型适配器。

该库会生成您需要的所有内容,包括 findViewById并为您留下实现适配器所需编写的最少代码。

您可以在这里查看:Gencycler

关于具有 2 种 View 类型的 kotlin recyclerview,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58968541/

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