📜  Android 中的 ConcatAdapter

📅  最后修改于: 2022-05-13 01:58:44.684000             🧑  作者: Mango

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] }。

使用来自各个适配器的数据,您可以按顺序创建具有多种视图类型的 recyclerView。

结论

最后要记住,如果我们需要在一个recyclerView中多次使用同一个recyclerView适配器,

  1. 我们可以创建同一个适配器的多个实例,并将它们添加到 ConcatAdapter 的函数Object() { [native code] } 中。
  2. 应该使用单独的适配器来实现逻辑。
  3. 当我们使用 notifyDataSetChanged() 方法更新任何适配器中的数据时,concat 适配器也会调用它的 notifyDataSetChanged() 方法()
  4. 我们可以在 ConcatAdapter函数Object() { [native code] } 中传递适配器列表,而不是单独传递适配器。所以,在我们的例子中。