{"id":27402335,"url":"https://github.com/hi-dhl/jdatabinding","last_synced_at":"2025-04-14T04:25:11.237Z","repository":{"id":57719949,"uuid":"254838971","full_name":"hi-dhl/JDataBinding","owner":"hi-dhl","description":"JDataBinding 是基于 DataBinding 封装的基础库，持续更新中 ...... 如果对你有帮助，请在右上角 star 一下，感谢","archived":false,"fork":false,"pushed_at":"2020-12-13T02:20:31.000Z","size":198,"stargazers_count":72,"open_issues_count":1,"forks_count":5,"subscribers_count":3,"default_branch":"master","last_synced_at":"2023-07-26T22:13:10.204Z","etag":null,"topics":["databinding","databindingactivity","databindingdialog","databindingfragment","databindinglistadapter","kotlin","listadapter","pagelist"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hi-dhl.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-04-11T09:59:04.000Z","updated_at":"2023-06-17T16:20:57.000Z","dependencies_parsed_at":"2022-09-26T22:30:36.689Z","dependency_job_id":null,"html_url":"https://github.com/hi-dhl/JDataBinding","commit_stats":null,"previous_names":[],"tags_count":2,"template":null,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hi-dhl%2FJDataBinding","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hi-dhl%2FJDataBinding/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hi-dhl%2FJDataBinding/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hi-dhl%2FJDataBinding/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hi-dhl","download_url":"https://codeload.github.com/hi-dhl/JDataBinding/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248820320,"owners_count":21166647,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["databinding","databindingactivity","databindingdialog","databindingfragment","databindinglistadapter","kotlin","listadapter","pagelist"],"created_at":"2025-04-14T04:25:10.635Z","updated_at":"2025-04-14T04:25:11.231Z","avatar_url":"https://github.com/hi-dhl.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# \u003cp align=\"center\"\u003e JDataBinding \u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\nJDataBinding 是基于 DataBinding 封装的基础库，欢迎 star\u003cbr/\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n\u003ca href=\"https://github.com/hi-dhl\"\u003e\u003cimg src=\"https://img.shields.io/badge/GitHub-HiDhl-4BC51D.svg?style=flat\"\u003e\u003c/a\u003e \u003ca href=\"https://opensource.org/licenses/Apache-2.0\"\u003e\u003cimg src=\"https://img.shields.io/badge/license-Apache2.0-blue.svg?style=flat\"\u003e\u003c/a\u003e \u003cimg src=\"https://img.shields.io/badge/language-kotlin-orange.svg\"/\u003e \u003cimg src=\"https://img.shields.io/badge/platform-android-lightgrey.svg\"/\u003e\n\u003c/p\u003e\n\n![DataBindingDialog](http://cdn.51git.cn/2020-04-19-DataBindingDialog.png) \n\n关于 JDataBinding 的解析可以查看我在掘金上的文章 [如何在项目中封装 Kotlin + Android Databinding](https://juejin.im/post/5e9c434a51882573663f6cc6)\n\nJDataBinding 是基于 DataBinding 封装的 基础库，可以在  `Activity` 、`AppCompatActivity` 、`FragmentActivity` 、`Fragment` 、 `Dialog` 、 `Adapter` 中直接使用\n\n## Download\n\n**Gradle**\n\n将下列代码添加进模块 build.gradle 文件内\n\n```\ndependencies {\n    implementation 'com.hi-dhl:jdatabinding:1.0.5'\n}\n```\n\n## Usage\n\n### 如何使用  Dialog 中如何使用\n\n```\nclass AppDialog(\n    context: Context,\n    val title: String? = null,\n    val message: String? = null,\n    val yes: AppDialog.() -\u003e Unit\n) : Dialog(context, R.style.AppDialog) {\n    private val mBinding: DialogAppBinding by binding()\n\n    init {\n        requireNotNull(message) { \"message must be not null\" }\n    }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        requestWindowFeature(Window.FEATURE_NO_TITLE)\n\n        mBinding.apply {\n            display.text = message\n            btnNo.setOnClickListener { dismiss() }\n            btnYes.setOnClickListener { yes() }\n        }\n\n    }\n}\n```\n\n**Step2: 简洁的调用方式**\n\n```\nAppDialog(\n        context = this@MainActivity,\n        message = msg,\n        yes = {\n            // do something\n        }).show()\n```\n\n### 如何使用 DataBindingActivity\n\n* jdatabinding \u003e= 1.0.4 的用法\n\n```\nclass MainActivity : FragmentActivity() {\n    private val mBinding: ActivityMainBinding by binding()\n}\n\nclass MainActivity : AppCompatActivity() {\n    private val mBinding: ActivityMainBinding by binding()\n}\n\nclass MainActivity : Activity() {\n    private val mBinding: ActivityMainBinding by binding()\n}\n```\n\n* jdatabinding \u003c= 1.0.3 的用法\n\n\n```\n\nclass MainActivity : DataBindingAppCompatActivity() {\n    private val mBinding: ActivityMainBinding by binding(R.layout.activity_main)\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        mBinding.apply {}\n    }\n}\n\nclass MainActivity : DataBindingActivity() {\n    private val mBinding: ActivityMainBinding by binding(R.layout.activity_main)\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        mBinding.apply {}\n    }\n}\n\nclass MainActivity : DataBindingFragmentActivity() {\n    private val mBinding: ActivityMainBinding by binding(R.layout.activity_main)\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        mBinding.apply {}\n    }\n}\n```\n\n### 如何使用 DataBindingFragment\n\n* jdatabinding \u003e= 1.0.5 的用法\n\n```\nclass FragmentTest(val mainViewModel: MainViewModel) : Fragment(R.layout.fragment_test) {\n\n    val bind: FragmentTestBinding by binding()\n}\n```\n\n* jdatabinding \u003c= 1.0.3 的用法\n\n```\nclass FragmentTest : DataBindingFragment() {\n    val testViewModel: MainViewModel by viewModel()\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View? {\n\n        return binding\u003cFragmentTestBinding\u003e(\n            inflater,\n            R.layout.fragment_test, container\n        ).apply {\n        }.root\n    }\n}\n```\n\n### 如何使用 DataBindingListAdapter\n\n**Step1: 继承BaseViewHolder**\n\n创建一个自定义的 ViewHolder 类，继承 DataBindingListAdapter，通过 viewHolderBinding 可以快速实现 DataBinding 的绑定\n\n```\nclass TestViewHolder(view: View) : BaseViewHolder\u003cModel\u003e(view) {\n\n    val binding: RecycieItemTestBinding by viewHolderBinding(view)\n\n    override fun bindData(data: Model, position: Int) {\n        binding.apply {\n            model = data\n            executePendingBindings()\n        }\n    }\n\n}\n```\n\n**Step2: 继承 DataBindingListAdapter**\n\n实现带头部和尾部的 Adapter，创建自定义的 Adapter，继承 DataBindingListAdapter\n\n```\nclass TestAdapter : DataBindingListAdapter\u003cModel\u003e(Model.CALLBACK) {\n\n    override fun viewHolder(layout: Int, view: View): DataBindingViewHolder\u003cModel\u003e = when (layout) {\n        R.layout.recycie_item_header -\u003e HeaderViewHolder(view)\n        else -\u003e TestViewHolder(view)\n    }\n\n    override fun layout(position: Int): Int = when (position) {\n        0 -\u003e R.layout.recycie_item_header\n        getItemCount() - 1 -\u003e R.layout.recycie_item_footer\n        else -\u003e R.layout.recycie_item_test\n    }\n\n    override fun getItemCount(): Int = super.getItemCount() + 2\n}\n```\n\n构造方法传入了 Model.CALLBACK，Model.CALLBACK 实现了 DiffUtil.ItemCallback，用于计算 list 的两个非空 item 的不同。具体要写两个抽象方法 areItemsTheSame 和 areContentsTheSame\n\n```\nval CALLBACK: DiffUtil.ItemCallback\u003cModel\u003e = object : DiffUtil.ItemCallback\u003cModel\u003e() {\n            // 判断两个Objects 是否代表同一个item对象， 一般使用Bean的id比较\n            override fun areItemsTheSame(oldItem: Model, newItem: Model): Boolean =\n                oldItem.id == newItem.id\n\n            // 判断两个Objects 是否有相同的内容。\n            override fun areContentsTheSame(oldItem: Model, newItem: Model): Boolean = true\n        }\n```\n\n**Step3: 绑定 RecyclerView 和 Adapter**\n\n```\n\u003cdata\u003e\n\n    \u003cvariable\n        name=\"viewModel\"\n        type=\"com.hi.dhl.jdatabinding.demo.ui.MainViewModel\" /\u003e\n\n    \u003cvariable\n        name=\"testAdapter\"\n        type=\"com.hi.dhl.jdatabinding.demo.ui.TestAdapter\" /\u003e\n\u003c/data\u003e\n\n\u003candroidx.recyclerview.widget.RecyclerView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        app:adapter=\"@{testAdapter}\"\n        app:adapterList=\"@{viewModel.mLiveData}\"\n        app:layoutManager=\"androidx.recyclerview.widget.LinearLayoutManager\" /\u003e\n\n```\n\n这里用到了 DataBinding 的自定义数据绑定部分，可以百度、Google具体的用法，具体实现可以参考 demo 下面 fragment_test.xml 文件\n\n\n\n\n### 联系我\n\n* 个人微信：hi-dhl\n* 公众号：ByteCode，包含 Jetpack ，Kotlin ，Android 10 系列源码，译文，LeetCode / 剑指 Offer / 多线程 / 国内外大厂算法题 等等一系列文章\n\n\u003cimg src='http://cdn.51git.cn/2020-10-20-151047.png' width = 350px/\u003e\n\n---\n\n最后推荐我一直在更新维护的项目和网站：\n\n* 计划建立一个最全、最新的 AndroidX Jetpack 相关组件的实战项目 以及 相关组件原理分析文章，正在逐渐增加 Jetpack 新成员，仓库持续更新，欢迎前去查看：[AndroidX-Jetpack-Practice](https://github.com/hi-dhl/AndroidX-Jetpack-Practice)\n\n* LeetCode / 剑指 offer / 国内外大厂面试题 / 多线程 题解，语言 Java 和 kotlin，包含多种解法、解题思路、时间复杂度、空间复杂度分析\u003cbr/\u003e\n\n    \u003cimage src=\"http://cdn.51git.cn/2020-10-04-16017884626310.jpg\" width = \"500px\"/\u003e\n  \n    * 剑指 offer 及国内外大厂面试题解：[在线阅读](https://offer.hi-dhl.com)\n    * LeetCode 系列题解：[在线阅读](https://leetcode.hi-dhl.com)\n\n* 最新 Android 10 源码分析系列文章，了解系统源码，不仅有助于分析问题，在面试过程中，对我们也是非常有帮助的，仓库持续更新，欢迎前去查看 [Android10-Source-Analysis](https://github.com/hi-dhl/Android10-Source-Analysis)\n\n* 整理和翻译一系列精选国外的技术文章，每篇文章都会有**译者思考**部分，对原文的更加深入的解读，仓库持续更新，欢迎前去查看 [Technical-Article-Translation](https://github.com/hi-dhl/Technical-Article-Translation)\n\n* 「为互联网人而设计，国内国外名站导航」涵括新闻、体育、生活、娱乐、设计、产品、运营、前端开发、Android 开发等等网址，欢迎前去查看 [为互联网人而设计导航网站](https://site.51git.cn)\n\n## 感谢\n\n[https://github.com/skydoves/BaseRecyclerViewAdapter](https://github.com/skydoves/BaseRecyclerViewAdapter)\n\n\n请参看 BaseRecyclerViewAdapter 相关协议。\n\n项目最初部分内容参考 BaseRecyclerViewAdapter，从 BaseRecyclerViewAdapter 扩展而来，\n\n同时也要感谢这篇文章 [Simple one-liner ViewBinding in Fragments and Activities with Kotlin](https://medium.com/@Zhuinden/simple-one-liner-viewbinding-in-fragments-and-activities-with-kotlin-961430c6c07c) \n和 [ViewBindingDelegate](https://github.com/hoc081098/ViewBindingDelegate) 开源库提供了思路\n\n欢迎大家前去查看，思路非常的好\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhi-dhl%2Fjdatabinding","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhi-dhl%2Fjdatabinding","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhi-dhl%2Fjdatabinding/lists"}