当前位置:   article > 正文

使用Recyclerview实现多布局效果_android recyclerview多布局

android recyclerview多布局

        Android应用开发中Recyclerview的使用频率非常高,多布局是使用Recyclerview经常实现效果之一。这里简单介绍一下多布局的基本开发流程,实现一个简单的多布局效果。

        实现如下效果图:

效果图

一、创建数据类

        创建数据类,用以模拟多布局填充数据。文中数据类以布尔值作为标识判断是否是标题数据。

  1. data class Types(
  2. /**
  3. * 是否标题
  4. */
  5. val isTitle: Boolean? = false,
  6. /**
  7. * 标题
  8. */
  9. val title: String? = null,
  10. /**
  11. * 图标
  12. */
  13. val icon: Int? = 0,
  14. /**
  15. * 名称
  16. */
  17. val name: String? = null
  18. )

二、创建网格布局

        使用Recyclerview创建常见的网格布局,最后再以此为基础实现多布局效果。

布局

  1. <androidx.recyclerview.widget.RecyclerView
  2. android:id="@+id/recyclerview"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent" />

适配器

  1. class MultiLayoutsAdapter(val data: MutableList<Types> /*数据集合*/) :
  2. RecyclerView.Adapter<RecyclerView.ViewHolder>(){
  3. //视图持有,提供视图的引用。
  4. class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
  5. //布局控件
  6. }
  7. //创建新视图
  8. override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
  9. //引用item布局文件
  10. }
  11. //替换视图的内容
  12. override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
  13. //从数据集合中获取元素替换视图内容
  14. }
  15. //返回数据集合的大小
  16. override fun getItemCount(): Int {
  17. //数据集合大小
  18. }
  19. }

Activity

  1. //设置网格布局管理器
  2. val manager = GridLayoutManager(this, 4)
  3. recyclerView.layoutManager = manager
  4. //设置用于描述item的适配器
  5. val adapter = MultiLayoutsAdapter(loadData() /*数据集合*/)
  6. recyclerView.adapter = adapter

三、创建多布局视图

        分别创建“标题”,“内容”视图。

标题

  1. <TextView
  2. android:id="@+id/tv_title"
  3. android:layout_width="wrap_content"
  4. android:layout_height="wrap_content"
  5. android:background="@drawable/bg_title_shape"
  6. android:gravity="center"
  7. android:textColor="@color/white"
  8. android:textSize="13sp"
  9. android:textStyle="bold" />

内容

  1. <FrameLayout
  2. android:layout_width="60dp"
  3. android:layout_height="60dp"
  4. android:background="@drawable/bg_content_shape">
  5. <ImageView
  6. android:id="@+id/iv_content_icon"
  7. android:layout_width="30dp"
  8. android:layout_height="30dp"
  9. android:layout_gravity="center"
  10. android:background="@drawable/bg_content_shape"
  11. android:src="@drawable/ic_tee" />
  12. </FrameLayout>
  13. <TextView
  14. android:id="@+id/tv_content_name"
  15. android:layout_width="wrap_content"
  16. android:layout_height="wrap_content"
  17. android:layout_marginTop="10dp"
  18. android:textColor="@color/black"
  19. android:textSize="13sp"
  20. android:textStyle="bold" />

四、修改适配器和Activity

        在创建好的网格布局适配器和Activity的基础上进行修改,最终实现多布局的效果。

适配器

  1. class MultiLayoutsAdapter(val data: MutableList<Types> /*数据集合*/) : RecyclerView.Adapter<RecyclerView.ViewHolder>(){
  2. //第一步,删除ViewHolder,分别创建标题和内容的视图持有TitleViewHolder、ContentViewHolder。
  3. // //视图持有,提供视图的引用
  4. // class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
  5. // //布局控件
  6. // }
  7. //视图持有,提供标题视图的引用。
  8. class TitleViewHolder(view: View) : RecyclerView.ViewHolder(view) {
  9. val tvTitle: TextView
  10. init {
  11. tvTitle = view.findViewById(R.id.tv_title)
  12. }
  13. }
  14. //视图持有,提供内容视图的引用。
  15. class ContentViewHolder(view: View) : RecyclerView.ViewHolder(view) {
  16. val ivIcon: ImageView
  17. val tvName: TextView
  18. init {
  19. ivIcon = view.findViewById(R.id.iv_content_icon)
  20. tvName = view.findViewById(R.id.tv_content_name)
  21. }
  22. }
  23. //创建新视图
  24. override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
  25. //第三步,创建新视图,根据标题或内容创建布局。
  26. return if (isTitle(viewType)) {
  27. val view =
  28. LayoutInflater.from(parent.context).inflate(R.layout.item_rlv_title, parent, false)
  29. TitleViewHolder(view)
  30. } else {
  31. val view = LayoutInflater.from(parent.context)
  32. .inflate(R.layout.item_rlv_content, parent, false)
  33. ContentViewHolder(view)
  34. }
  35. }
  36. //替换视图的内容
  37. override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
  38. //第四步,判断持有类型,从数据集合中获取元素并用该元素替换视图的内容。
  39. if (holder is TitleViewHolder) {
  40. holder.tvTitle.text = data[position].title
  41. } else if (holder is ContentViewHolder) {
  42. holder.ivIcon.setImageResource(data[position].icon!!)
  43. holder.tvName.text = data[position].name
  44. }
  45. }
  46. //返回数据集合的大小
  47. override fun getItemCount(): Int {
  48. //第五步,返回数据集合大小。
  49. return data.size
  50. }
  51. //第二步,提供视图类型判断。
  52. //获取Item视图类型
  53. override fun getItemViewType(position: Int): Int {
  54. if (isTitle(position)) {
  55. return position
  56. }
  57. return 1
  58. }
  59. //判断是否是标题
  60. private fun isTitle(position: Int): Boolean {
  61. return data[position].isTitle == true
  62. }
  63. }

Activity

  1. //设置网格布局管理器
  2. val manager = GridLayoutManager(this, 4)
  3. recyclerView.layoutManager = manager
  4. //关键代码
  5. //设置标题占多少个spanCount
  6. manager.spanSizeLookup = (object : GridLayoutManager.SpanSizeLookup() {
  7. override fun getSpanSize(position: Int): Int {
  8. if (loadData()[position].isTitle == true) {
  9. return manager.spanCount
  10. }
  11. return 1
  12. }
  13. })
  14. //设置用于描述item的适配器
  15. val adapter = MultiLayoutsAdapter(loadData() /*数据集合*/)
  16. recyclerView.adapter = adapter

最后

        到此我们实现了一个非常简单的多布局类型案例,希望对你有所帮助。

 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号