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)
    }
}


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

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