Android 中的 ConcatAdapter
ConcatAdapter 是 recyclerview:1.2.0-alpha02 中提供的一个新类,它使您能够按顺序组合多个适配器以显示在单个 RecyclerView 中。这使您能够更好地封装适配器,而不必将许多数据源组合到一个适配器中,从而使它们保持专注和可重用。默认情况下,ConcatAdapter 将嵌套适配器的视图类型相互隔离,以便在将视图类型报告回 RecyclerView 之前更改视图类型,以避免添加的适配器的视图类型之间发生任何冲突。
分步实施
第1步:
添加 concat 适配器所需的依赖项。它是recyclerView 的一个组件。在应用程序的开发中。毕业包括,
implementation "androidx.recyclerview:recyclerview:1.2.0-alpha05"
第2步:
对于上面的屏幕,我们有三种不同类型的视图。因此,为了结构化数据,我们必须在模型包中创建三个不同的数据类:Gfg、Course 和 Banner。其中 User 用于组织用户列表的数据。 MyDetail 用于显示我的用户数据,Banner 用于显示横幅。用户似乎是,
data class Gfg(
val id: Int = 0,
val course: String = "",
val price: String = ""
)
课程数据类看起来像,
data class Course(
val Courseid: Int = 0,
val name: String = "",
val tags: String = ""
)
和横幅看起来像,
data class Banner(
val bannerImage: Int = 0
)
第 3 步:
我们将为用户列表创建一个数据源以显示该列表。为此,我们将创建一个 DataSource 对象,在其中,
Kotlin
object DataSource {
fun getGfg() = ArrayList().apply {
add(Gfg(1, "Spandan", "https://s3.amazonaws.com/uifaces/faces/twitter/sunlandictwin/128.jpg"))
add(Gfg(2, "Anshu", "https://s3.amazonaws.com/uifaces/faces/twitter/mufaddal_mw/128.jpg"))
add(Gfg(3, "Eklavya", "https://s3.amazonaws.com/uifaces/faces/twitter/mufaddal_mw/128.jpg"))
add(Gfg(3, "the-rebooted-coder", "https://s3.amazonaws.com/uifaces/faces/twitter/allfordesign/128.jpg"))
add(Gfg(4, "richierich_anshu", "https://s3.amazonaws.com/uifaces/faces/twitter/shaneIxD/128.jpg"))
fun getBanner() = Banner(R.drawable.gfg_site_cover)
}
Kotlin
class GfgAdapter(
private val gfgCourseDetails: GfgCourseDetails
) : RecyclerView.Adapter() {
class DataViewHolder(gfgCourseItem: View) : RecyclerView.ViewHolder(gfgCourseItem) {
fun bind(user: GfgCourseDetails) {
gfgCourseItem.textViewUser.text = user.courseName
gfgCourseItem.textViewPrice.text = user.Price
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
DataViewHolder(
LayoutInflater.from(parent.context).inflate(
R.layout.item_layout_gfg_course, parent,
false
)
)
override fun getItemCount(): Int = 1
override fun onBindViewHolder(holder: DataViewHolder, position: Int) =
holder.bind(gfgCourseDetails)
}
Kotlin
class GfgAdapter(
private val gfg: ArrayList
) : RecyclerView.Adapter() {
class DataViewHolder(gfgCourseItem: View) : RecyclerView.ViewHolder(gfgCourseItem) {
fun bind(gfg: Gfg) {
gfgCourseItem.textViewGfgName.text = gfg.name
Glide.with(gfgCourseItem.imageViewAvatar.context)
.load(gfg.avatar)
.into(gfgCourseItem.imageViewAvatar)
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
DataViewHolder(
LayoutInflater.from(parent.context).inflate(
R.layout.item_layout, parent,
false
)
)
override fun getItemCount(): Int = gfg.size
override fun onBindViewHolder(holder: DataViewHolder, position: Int) =
holder.bind(gfg[position])
}
Kotlin
class gfgMainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.gfg_mains)
}
}
Kotlin
private fun setupDataInRecyclerView() {
recyclerView.layoutManager = LinearLayoutManager(this)
gfgVerticalAdapter = GfgsAdapter(DataSource.getGfg())
coursePriceAdapter = CoursePriceAdapter(DataSource.getCoursePrice())
myDetailAdapter = MyDetailAdapter(myDetail)
adapter = ConcatAdapter(myDetailAdapter, gfgVerticalAdapter,coursePriceAdapter)
recyclerView.adapter = adapter
}
第4步:
在 RecyclerView 中,Concat Adapter 辅助按顺序显示 RecyclerView Adapter。因此,在我们的用例中,我们将首先定义三个不同的适配器,
科特林
class GfgAdapter(
private val gfgCourseDetails: GfgCourseDetails
) : RecyclerView.Adapter() {
class DataViewHolder(gfgCourseItem: View) : RecyclerView.ViewHolder(gfgCourseItem) {
fun bind(user: GfgCourseDetails) {
gfgCourseItem.textViewUser.text = user.courseName
gfgCourseItem.textViewPrice.text = user.Price
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
DataViewHolder(
LayoutInflater.from(parent.context).inflate(
R.layout.item_layout_gfg_course, parent,
false
)
)
override fun getItemCount(): Int = 1
override fun onBindViewHolder(holder: DataViewHolder, position: Int) =
holder.bind(gfgCourseDetails)
}
然后,为了显示用户列表,我们将创建另一个适配器。用户适配器,
科特林
class GfgAdapter(
private val gfg: ArrayList
) : RecyclerView.Adapter() {
class DataViewHolder(gfgCourseItem: View) : RecyclerView.ViewHolder(gfgCourseItem) {
fun bind(gfg: Gfg) {
gfgCourseItem.textViewGfgName.text = gfg.name
Glide.with(gfgCourseItem.imageViewAvatar.context)
.load(gfg.avatar)
.into(gfgCourseItem.imageViewAvatar)
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
DataViewHolder(
LayoutInflater.from(parent.context).inflate(
R.layout.item_layout, parent,
false
)
)
override fun getItemCount(): Int = gfg.size
override fun onBindViewHolder(holder: DataViewHolder, position: Int) =
holder.bind(gfg[position])
}
步骤#5:
要使用我们在 ConcatAdapter 中创建的适配器,我们将首先创建一个名为 MainActivity 的活动,它也将用作我们的启动器活动。
科特林
class gfgMainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.gfg_mains)
}
}
在 MainActivity 中,我们现在将添加四个变量。
lateinit var gfgGfg: ConcatGfg
lateinit var myDetailGfg: MyDetailGfg
lateinit var userVerticalGfg: UsersGfg
lateinit var coursePriceGfg: CoursePriceGfg
这将在 Activity 的 onCreate 中调用。在函数中,我们现在将初始化变量并将它们设置到适配器。这将在 Activity 的 onCreate 中调用。在函数中,我们现在将初始化变量并将它们设置到适配器。
科特林
private fun setupDataInRecyclerView() {
recyclerView.layoutManager = LinearLayoutManager(this)
gfgVerticalAdapter = GfgsAdapter(DataSource.getGfg())
coursePriceAdapter = CoursePriceAdapter(DataSource.getCoursePrice())
myDetailAdapter = MyDetailAdapter(myDetail)
adapter = ConcatAdapter(myDetailAdapter, gfgVerticalAdapter,coursePriceAdapter)
recyclerView.adapter = adapter
}
在本节中,我们将初始化适配器 UserAdapter、BannerAdapter 和 MyDetailAdapter,并从 DataSource 对象传递数据。现在,我们将使用它来初始化 recyclerView 的布局管理器。
recyclerView.layoutManager = LinearLayoutManager(this)
最后,我们将创建一个 ConcatAdapter 并将适配器传递给它的函数Object() { [native code] }。
GeekTip: The Sequence on which we will pass the adapter, the ConcatAdapter, will draw the list in the recyclerView in the same sequence.
使用来自各个适配器的数据,您可以按顺序创建具有多种视图类型的 recyclerView。
结论
最后要记住,如果我们需要在一个recyclerView中多次使用同一个recyclerView适配器,
- 我们可以创建同一个适配器的多个实例,并将它们添加到 ConcatAdapter 的函数Object() { [native code] } 中。
- 应该使用单独的适配器来实现逻辑。
- 当我们使用 notifyDataSetChanged() 方法更新任何适配器中的数据时,concat 适配器也会调用它的 notifyDataSetChanged() 方法()
- 我们可以在 ConcatAdapter函数Object() { [native code] } 中传递适配器列表,而不是单独传递适配器。所以,在我们的例子中。