共享我的封装的 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.myapplication

import androidx.recyclerview.widget.RecyclerView
import android.view.ViewGroup
import androidx.databinding.ViewDataBinding
import androidx.databinding.DataBindingUtil
import android.view.LayoutInflater
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup
import java.util.ArrayList
import java.io.Serializable

import android.view.View

/**
 *  多布局 Adapter
 *  老规矩 先写用法
 *  备注: 必须使用databinding  也就是说 item的layout 必须用<layout> 标签包起来  不会的自行百度哦
 *
 *
 *
 *
 *
 *
 *
 *
 */
open class PAdapter2Kt(
    mData: List<PAdapter2Mode>,
    var bindViewInterface: (binding: ListHolder, position: Int, type: Int, data: Any) -> Unit,
    vararg layoutId: Int
) : RecyclerView.Adapter<ListHolder>() {
    private val layoutId: IntArray
    private var list: List<PAdapter2Mode> = 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<ViewDataBinding>(
            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
    }
}
微信扫码订阅
UP更新不错过~
关注
  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

疯狂的小彭彭

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值