使用kotlin和databinding简单封装adapter

实现非常简单,主要运用了databinding的特性实现,使用非常简单
https://github.com/TianGuisen/KtBindAdapter
使用方法
item布局中必须这样写,name="item",否则baseAdapter中BR.item会报错无法使用


        

创建adapter

//单type,直接创建SimpleAdapter即可,没有item子view的点击事件
val testAdapter = SimpleAdapter(listData, R.layout.item_sigle1)
//多type
val itemInfos = mutableListOf>()
val multiAdapter = SimpleMultiAdapter(itemInfos)
//添加布局
multiAdapter.addItemType(TYPE0, R.layout.item_type0)
multiAdapter.addItemType(TYPE1, R.layout.item_type1)
//
multiAdapter.setOnItemClickLisener { multiItem: MultiItem, view: View, i: Int ->
    ToastUtil.normal("点击的是item:" + multiItem + "  位置:" + i)
}

实现


abstract class BaseAdapter internal constructor(datas: MutableList) : RecyclerView.Adapter>() {
    internal var mDatas: MutableList = datas
    internal var itemClickLisener: OnItemClickLisener? = null
    internal var childClickLisener: OnChildClickLisener? = null
    internal var itemLongClickLisener: OnItemLongClickLisener? = null


    fun setChildClickLisener(function: (E, View, Int) -> Unit) {
        this.childClickLisener = object : OnChildClickLisener {
            override fun childClick(bean: E, view: View, position: Int) {
                function(bean, view, position)
            }
        }
    }

    fun setOnItemClickLisener(itemClickLisener: OnItemClickLisener) {
        this.itemClickLisener = itemClickLisener
    }

    fun setOnItemClickLisener(function: (E, View, Int) -> Unit) {
        this.itemClickLisener = object : OnItemClickLisener {
            override fun itemClick(bean: E, view: View, position: Int) {
                function(bean, view, position)
            }
        }
    }

    fun setItemLongClickLisener(function: (E, View, Int) -> Unit) {
        this.itemLongClickLisener = object : OnItemLongClickLisener {
            override fun itemLongClick(bean: E, view: View, position: Int) {
                function(bean, view, position)
            }
        }
    }

    interface OnItemClickLisener {
        fun itemClick(bean: E, view: View, position: Int)
    }

    interface OnChildClickLisener {
        fun childClick(bean: E, view: View, position: Int)
    }

    interface OnItemLongClickLisener {
        fun itemLongClick(bean: E, view: View, position: Int)
    }

    override fun onBindViewHolder(holder: BindViewHolder, position: Int) {
        val bean = mDatas[position]
        val itemView = holder.binding.getRoot()
        if (itemClickLisener != null) {
            itemView.setOnClickListener {
                itemClickLisener!!.itemClick(bean, holder.binding.getRoot(), position)
            }
        }
        decorator(bean, holder, position)
        //如果是BaseMultiAdapter需要处理一下
        if (mDatas[position] is MultiItem<*>) {
            val pinnedHeaderEntity = mDatas[position] as MultiItem<*>
            holder.binding.setVariable(item, pinnedHeaderEntity.data)
        } else {
            holder.binding.setVariable(item, mDatas[position])
        }
        holder.binding.executePendingBindings()
    }

    abstract fun decorator(bean: E, holder: BindViewHolder, position: Int)

    open fun remove(position: Int) {
        mDatas.removeAt(position)
        notifyItemRemoved(position)
    }

    open fun clear() {
        mDatas.clear()
        notifyDataSetChanged()
    }

    override fun getItemCount(): Int {
        return mDatas.size
    }

}
/**
 * 单type
 * 如果item内容填充较复杂,无法在item的xml中完成,需要在decorator完成填充,就使用这个
 * 或者需要子view的点击事件使用这个
 */
open abstract class BaseSigleAdapter : BaseAdapter {

    private var layoutId: Int = 0

    constructor(datas: MutableList, layoutId: Int) : super(datas) {
        this.layoutId = layoutId
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BindViewHolder {
        val binding = DataBindingUtil.inflate(LayoutInflater.from(parent.context), layoutId, parent, false)
        return BindViewHolder(binding.root, binding)
    }

    fun add(data: E) {
        mDatas.add(data)
        notifyDataSetChanged()
    }

    fun add(position: Int, data: E) {
        mDatas.add(position, data)
        notifyDataSetChanged()
    }

    fun set(data: List) {
        mDatas.clear()
        addAll(data)
    }

    fun addAll(data: List) {
        mDatas.addAll(data)
        notifyDataSetChanged()
    }
}
/**
 * 多type
 * 如果item内容填充较复杂,无法在item的xml中完成,需要在decorator完成填充,就使用这个
 * 或者需要子view的点击事件使用这个
 */
open abstract class BaseMultiAdapter : BaseAdapter, ViewDataBinding> {
    constructor(data: MutableList>) : super(data)

    private val layouts: SparseIntArray = SparseIntArray()

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BindViewHolder {
        val binding = DataBindingUtil.inflate(LayoutInflater.from(parent.context), layouts.get(viewType), parent, false)
        onCreateViewHolderDecorate(binding, viewType)
        return BindViewHolder(binding.root, binding)
    }

    open fun onCreateViewHolderDecorate(view: ViewDataBinding, viewType: Int) {

    }

    override fun getItemViewType(position: Int): Int {
        return mDatas.get(position).itemType
    }

    fun addItemType(type: Int, @LayoutRes layoutResId: Int) {
        layouts.put(type, layoutResId)
    }
}
class BindViewHolder(itemView: View, val binding: VB) : RecyclerView.ViewHolder(itemView)
/**
 * 多type的需要用这个包装实体类
 */
class MultiItem(var itemType: Int, var data: T) {
    override fun toString(): String {
        return "MultiItem(itemType=$itemType, data=$data)"
    }
}
/**
 * Created by 田桂森 on 2017/8/17.
 * 如果不需要设置item中子类点击事件用这个
 */

class SimpleAdapter(datas: MutableList, layoutId: Int) : BaseSigleAdapter(datas, layoutId) {
    override fun decorator(bean: E, holder: BindViewHolder, position: Int) {

    }
}
/**
 * Created by 田桂森 on 2017/8/18.
 * 多type如果不需要设置item中子类子类点击事件用这个
 */
class SimpleMultiAdapter(datas: MutableList>) : BaseMultiAdapter(datas) {
    override fun decorator(bean: MultiItem, holder: BindViewHolder, position: Int) {

    }
}

你可能感兴趣的:(使用kotlin和databinding简单封装adapter)