> 文档中心 > 共享我的封装的 kotlin recycleview adapter (支持多种布局)

共享我的封装的 kotlin recycleview adapter (支持多种布局)

 /  *    0 代码 布局标签  必须 从0开始整数自增 比如1230  321504   如果tape 最大数字是2 就必须给adapter 设置至少三个布局 因为所有的不同种类的布局  都放在数组  然后通过下标获取 data 可是是任何类型 .setCon(1)  代表占几格 如果GridLayoutManager  的spanCount =6  .setCon(1) 就是占屏幕的1/6  .setCon(6) 就是宽度 全屏  */// ---------------用法-----------------------// 准备数据// list.add(PAdapter2Mode(0, "").setCon(1))//// list.add(PAdapter2Mode(1, "").setCon(1))//// list.add(PAdapter2Mode(2, "").setCon(1))
//设置给view// binding.rec.layoutManager = GridLayoutManager(this, 6)
// val adapter = PAdapter2Kt(//     list, { binding, position, type, data ->//  when (type) {//      0 -> {//   var binding1 = binding.binding as item1Binding////      }////      1 -> {//   var binding2 = binding.binding as item2Binding////      }//  }////     },//     R.layout.item1,// 自己的不同类型的item 布局//     R.layout.item2,//     R.layout.item3// )//// binding.rec.adapter = adapter

package com.and.myapplicationimport androidx.recyclerview.widget.RecyclerViewimport android.view.ViewGroupimport androidx.databinding.ViewDataBindingimport androidx.databinding.DataBindingUtilimport android.view.LayoutInflaterimport androidx.recyclerview.widget.GridLayoutManagerimport androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookupimport java.util.ArrayListimport java.io.Serializableimport android.view.View/ *  多布局 Adapter *  老规矩 先写用法 *  备注: 必须使用databinding  也就是说 item的layout 必须用 标签包起来  不会的自行百度哦 * * * * * * * * */open class PAdapter2Kt(    mData: List,    var bindViewInterface: (binding: ListHolder, position: Int, type: Int, data: Any) -> Unit,    vararg layoutId: Int) : RecyclerView.Adapter() {    private val layoutId: IntArray    private var list: List = ArrayList()    override fun getItemId(position: Int): Long { return position.toLong()    }    override fun getItemViewType(position: Int): Int { return list[position].type    }    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ListHolder { val binding = DataBindingUtil.inflate(     LayoutInflater.from(parent.context),     layoutId[viewType],     parent,     false ) val listHolder = ListHolder(binding.root) listHolder.binding = binding return listHolder    }    override fun onBindViewHolder(holder: ListHolder, position: Int) { bindViewInterface(     holder,     position,     getItemViewType(position),     if (list[position].data == null) "" else list[position].data!! )    }    override fun getItemCount(): Int { return list.size    }    override fun onAttachedToRecyclerView(recyclerView: RecyclerView) { super.onAttachedToRecyclerView(recyclerView) val manager = recyclerView.layoutManager if (manager is GridLayoutManager) {     val gridManager = manager     gridManager.spanSizeLookup = object : SpanSizeLookup() {  override fun getSpanSize(position: Int): Int {      return if (list[position].con == 0) gridManager.spanCount else list[position].con  }     } }    }    init { list = mData this.layoutId = layoutId this.bindViewInterface = bindViewInterface    }}class ListHolder(itemView: View?) : RecyclerView.ViewHolder(itemView!!) {    var binding: ViewDataBinding? = null}class PAdapter2Mode : Serializable {    var type: Int    var gid = 0    fun Setgid(gid: Int): PAdapter2Mode { this.gid = gid return this    }      var con = 0    fun Setcon(con: Int): PAdapter2Mode { this.con = con return this    }    var data: Any? = null private set    fun setData(data: Any?): PAdapter2Mode { this.data = data return this    }    constructor(type: Int, data: Any?) { this.type = type this.data = data    }    fun setCon(con: Int): PAdapter2Mode { this.con = con return this    }    constructor(type: Int) { this.type = type    }    fun setGid(gid: Int): PAdapter2Mode { this.gid = gid return this    }}