# TestBinding
**Repository Path**: Sun.start/TestBinding
## Basic Information
- **Project Name**: TestBinding
- **Description**: 测试严格databinding
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 3
- **Forks**: 0
- **Created**: 2022-12-07
- **Last Updated**: 2023-02-15
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## 声明
本库灵感以及很多设计方式借鉴 大佬[KunMinX](https://github.com/KunMinX) 的[Strict-DataBinding](https://github.com/KunMinX/Strict-DataBinding),小弟只是站在巨人的肩膀上进行KT语法的开发以及部分自己设计,感谢大佬的思路
## 撸代码之前
### 本库作用
您可以阅读上面KunMinX 的源库获取最原始的解释
下面是我这边做的简单介绍
本库的主要作用是剥离上层使用者对于binding的访问,以解决用户使用binding去调用View实例的null安全一致性的问题
### 目前可能带来的问题
* 由于剥离binding导致Activity无法对View进行访问,所以在做一些动画时可能需要去做bindingAdapter进行View操作扩展,然后进行绑定
* 关于Activity引入Fragment和Fragment切换问题,在MainActivity中有实现,但是仍旧是用到了viewId,这个暂时没想到好办法,后面看看能不能解决
### 重要的事情说三遍
请在使用模块build.gradle中开启 databinding 支持以及 kapt 依赖!!
请在使用模块build.gradle中开启 databinding 支持以及 kapt 依赖!!
请在使用模块build.gradle中开启 databinding 支持以及 kapt 依赖!!
````groovy
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
id 'kotlin-kapt' //这里
}
````
```groovy
android {
// ...省略N多代码
dataBinding {
enabled = true
}
}
```
### 添加代码依赖
```groovy
allprojects {
repositories {
// ...
maven { url 'https://jitpack.io' }
}
}
```
```groovy
dependencies {
implementation 'com.github.SunStarJ:StrictBindingKT:v0.0.6'
}
```
## 开始撸码
### 绑定工具介绍
仅仅展示数据构造,使用时按照格式传入即可
```kotlin
// layoutId 绑定viewResourceId
// xmlBindingData 绑定使用数据(可变参数,传入多少就好了)
class DataBindingConfig(val layoutId: Int, vararg xmlBindingData: XMLBindingData){
var xmlBindingDataArray = xmlBindingData
}
// id databinding 自动生成的BR id 数据
// value xml 文件中variable 导入绑定数据
data class XMLBindingData(val id: Int, val value: Any)
```
### Activity使用
仅展示核心代码,代码细节可以直接查看原始[MainActivity](/app/src/main/java/com/sunstar_j/testbinding/MainActivity.kt)
``` kotlin
class MainActivity : SBindActivity() {
// ...省略代码
private val dataBindingConfig by lazy { //构造绑定配置文件,因为直接声明的话BR没有生成就已经调用所以使用lazy,也可以在initBindingConfig() 方法中直接return DataBindingConfig 实例
DataBindingConfig(
R.layout.activity_main,
XMLBindingData(BR.changeTextClick, OnClickListener { mainVM.addListData() }),
XMLBindingData(BR.mainVm, mainVM),
XMLBindingData(BR.adapter, TestAdapter(this)),
XMLBindingData(
BR.navigationChange,
OnItemSelectedListener {
val index = when (it.itemId) {
R.id.main_home -> 0
R.id.main_my -> 1
else -> -1
}
changeFragment(index)
index != -1
}),
XMLBindingData(
BR.fabClick,
OnClickListener { userVM.setNewUserName() })
)
}
override fun initBindingConfig(): DataBindingConfig {
// ..省略代码
return dataBindingConfig
}
// ...省略代码
}
```
### Adapter 实现
```xml
```
Adapter 实现代码
```kotlin
class TestAdapter(context: Context) : SBindAdapter(context) {
override fun setItemConfig(positionData: TestData): List = mutableListOf(
XMLBindingData(BR.testData,positionData),
XMLBindingData(BR.genderClick,View.OnClickListener {
Log.e("TestAdapter", "你点击了${positionData.name}的性别,他的性别是${positionData.gander}", )
})
)
override fun setLayoutId(viewType: Int): Int = R.layout.user_test
}
```
使用了BindAdapter 实现,实现方式如下
```kotlin
@BindingAdapter("recycleViewList")
fun initRecycleViewList(recyclerView: RecyclerView, dataList: ObservableArrayList<*>) {
recyclerView.adapter?.let {
(it as SBindAdapter<*>).initDataList(dataList)
}
}
@BindingAdapter("recycleViewAdapter")
fun initRecycleViewAdapter(recyclerView: RecyclerView, adapter: SBindAdapter<*>) {
recyclerView.adapter = adapter
}
```
### Fragment 核心代码
```kotlin
class UserFragment private constructor() : SBindFragment() {
private val userViewModel by lazy { //生成viewmodel
applicationVM()
}
private val config: DataBindingConfig by lazy { //生成配置实例
DataBindingConfig(R.layout.user_fragment, XMLBindingData(BR.usrVM,userViewModel))
}
override fun initDataBindingConfig(): DataBindingConfig = config
companion object{
fun newInstance(): UserFragment {
return UserFragment()
}
}
}
```
## 写在最后
再次感谢[KunMinX](https://github.com/KunMinX)大佬开源出来的实现思路
也不知道会不会有人用,如果有人用的话能不能给个start。一个不入流小Android,期待您的批评和指正,谢谢,完结撒花