BindingAdp (databinding+recyclerview adapter)

优点

代码少,仅仅一个类,功能仅简化,需要更多功能需要自己扩展

数据绑定后,数据变化自动刷新,无需手动刷新(addOnListChangedCallback)

使用方法

class Adp : BindingAdp<ItemBinding, Bean>(R.layout.item) {
        override fun bindData(binding: ItemBinding, data: Bean) {
            binding.bean = data
        }
    }
adp.addHeaderView(headerBinding.root)//添加头view
adp.setData(list)//设置数据源,变量传递

注ItemBinding为databinding下的item布局,Bean为model,bindData中手动为item设置model

BindingAdp.kt

package wine.ls.com.databinding

import android.databinding.DataBindingUtil
import android.databinding.ObservableArrayList
import android.databinding.ObservableList
import android.databinding.ViewDataBinding
import android.os.Handler
import android.os.Looper
import android.os.Message
import android.support.v7.widget.RecyclerView
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.support.v7.widget.StaggeredGridLayoutManager
import android.support.v7.widget.GridLayoutManager


abstract class LBindingAdp<T : ViewDataBinding, D>(private val layoutRes: Int) : RecyclerView.Adapter<LBindingAdp.LBindingVH>() {
    private val hanlder = object : Handler(Looper.getMainLooper()) {
        override fun handleMessage(msg: Message?) {
            super.handleMessage(msg)
            when (msg!!.what) {
                1 -> notifyDataSetChanged()
                2 -> {
                    val strs = msg.obj.toString().split(",")
                    notifyItemRangeChanged(strs[0].toInt(), strs[1].toInt())
                }
                3 -> {
                    val strs = msg.obj.toString().split(",")
                    notifyItemRangeInserted(strs[0].toInt(), strs[1].toInt())
                }
                4 -> {
                    val strs = msg.obj.toString().split(",")
                    notifyItemRangeRemoved(strs[0].toInt(), strs[2].toInt())
                    notifyItemRangeInserted(strs[1].toInt(), strs[2].toInt())
                }
                5 -> {
                    val strs = msg.obj.toString().split(",")
                    notifyItemRangeRemoved(strs[0].toInt(), strs[1].toInt())
                }
            }
        }
    }
    private var list: ObservableArrayList<D>? = null
    private val HEAD = 1111
    private val NORMAL = 2222
    private var headView: View? = null

    fun addHeaderView(view: View) {
        headView = view
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): LBindingVH {
        return if (viewType == HEAD) {
            LBindingVH(headView!!)
        } else {
            LBindingVH(LayoutInflater.from(parent.context).inflate(layoutRes, parent, false))
        }
    }

    fun setData(lis: ObservableArrayList<D>) {
        this.list = lis
        this.list!!.addOnListChangedCallback(callback)
    }

    private var callback: ObservableList.OnListChangedCallback<ObservableList<D>> = object : ObservableList.OnListChangedCallback<ObservableList<D>>() {
        override fun onChanged(sender: ObservableList<D>) {
            hanlder.sendEmptyMessage(1)
        }

        override fun onItemRangeChanged(sender: ObservableList<D>, positionStart: Int, itemCount: Int) {
            val msg = Message()
            msg.what = 2
            msg.obj = "$positionStart,$itemCount"
            hanlder.sendMessage(msg)
        }

        override fun onItemRangeInserted(sender: ObservableList<D>, positionStart: Int, itemCount: Int) {
            val msg = Message()
            msg.what = 3
            msg.obj = "$positionStart,$itemCount"
            hanlder.sendMessage(msg)
        }

        override fun onItemRangeMoved(sender: ObservableList<D>, fromPosition: Int, toPosition: Int, itemCount: Int) {
            val msg = Message()
            msg.what = 4
            msg.obj = "$fromPosition,$toPosition,$itemCount"
            hanlder.sendMessage(msg)
        }

        override fun onItemRangeRemoved(sender: ObservableList<D>, positionStart: Int, itemCount: Int) {
            val msg = Message()
            msg.what = 5
            msg.obj = "$positionStart,$itemCount"
            hanlder.sendMessage(msg)
        }
    }

    override fun getItemCount() = if (headView != null) list!!.size + 1 else list!!.size
    override fun onBindViewHolder(holder: LBindingVH, position: Int) {
        if (null == headView) {
            val binding = DataBindingUtil.getBinding<T>(holder.itemView) as T
            bindData(binding, list!![position])
            binding.executePendingBindings()
        } else {
            if (position > 0) {
                val binding = DataBindingUtil.getBinding<T>(holder.itemView) as T
                bindData(binding, list!![position - 1])
                binding.executePendingBindings()
            }
        }
    }

    override fun onAttachedToRecyclerView(recyclerView: RecyclerView) {
        super.onAttachedToRecyclerView(recyclerView)
        val manager = recyclerView.layoutManager
        if (manager is GridLayoutManager) {
            manager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
                override fun getSpanSize(position: Int): Int {
                    return if (getItemViewType(position) == HEAD)
                        manager.spanCount
                    else
                        1
                }
            }
        }
    }

    override fun onViewAttachedToWindow(holder: LBindingVH) {
        super.onViewAttachedToWindow(holder)
        val lp = holder.itemView.layoutParams
        if (lp != null && lp is StaggeredGridLayoutManager.LayoutParams) {
            lp.isFullSpan = holder.layoutPosition == 0
        }
    }

    abstract fun bindData(binding: T, data: D)

    override fun getItemViewType(position: Int): Int {
        return if (headView != null && position == 0) {
            HEAD
        } else {
            NORMAL
        }
    }

    class LBindingVH(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val binding: ViewDataBinding? = DataBindingUtil.bind(itemView)
    }
}


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,100评论 18 139
  • 先吐槽下,不说不爽,不说不通达 不吐不快,集合我这几天学习 DataBinding 的经历说几句。DataBind...
    前行的乌龟阅读 21,143评论 13 46
  • 更多英语学习干货,搜索微信公众号“知识分子英语研习社”。带你悄悄变厉害~ This is Scientific A...
    知识分子英语研习阅读 818评论 0 0
  • 还有一个多月就差半年了,离开你半年了。 和他们约了好多次说要去看你,然而还差一个多月就半年了,我也没能回去看你一眼...
    清酒无欢阅读 191评论 0 0
  • 前段时间,公司来了个做前端的实习生,领导让我给她讲讲前端方面的技术学习阶段。回想自己接触前端也就1年多点,其实也没...
    Kavim阅读 288评论 0 1