# 充值系统 (Recharge System)
这是一个基于Android的充值系统项目,采用模块化架构设计,使用Room数据库进行数据持久化存储。
## 项目结构
项目包含以下模块:
- `app`: 主应用模块
- `baselibrary`: 基础库,包含基本工具类和通用组件
- `generallibrary`: 通用功能库,包含数据库操作等通用功能
- `henanlibrary`: 河南地区特定功能模块
- `qihealonelibrary`: 齐河单机版功能模块
- `qiheonlinelibrary`: 齐河在线版功能模块
- `ocridcardlibrary`: 身份证识别模块
- `easysocket`: Socket通信模块
- `pickerviewlibrary`: 选择器视图库
## 技术栈
- 开发语言:Kotlin & Java
- 数据库:Room
- 网络通信:Retrofit & Socket
- 依赖注入:未使用
- 异步处理:RxJava
- 权限管理:XXPermissions
- 视图绑定:
- ViewBinding:用于安全高效地访问视图
- DataBinding:用于数据驱动UI的MVVM架构实现
## 视图绑定配置
### ViewBinding
在模块级build.gradle中启用ViewBinding:
```gradle
android {
buildFeatures {
viewBinding true
}
}
```
使用示例:
```kotlin
class ExampleActivity : AppCompatActivity() {
private lateinit var binding: ActivityExampleBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityExampleBinding.inflate(layoutInflater)
setContentView(binding.root)
// 直接访问视图
binding.textView.text = "Hello ViewBinding"
}
}
```
### DataBinding
在模块级build.gradle中启用DataBinding:
```gradle
android {
buildFeatures {
dataBinding true
}
}
```
使用示例:
1. 布局文件:
```xml
```
2. Activity中使用:
```kotlin
class ExampleActivity : AppCompatActivity() {
private lateinit var binding: ActivityExampleBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, R.layout.activity_example)
binding.user = User("张三")
binding.lifecycleOwner = this
}
}
```
### 最佳实践
- ViewBinding:
- 用于简单的视图访问场景
- 替代findViewById,避免空指针异常
- 编译时类型安全
- DataBinding:
- 用于实现MVVM架构
- 数据驱动UI更新
- 双向绑定支持
- 自定义绑定适配器
- 表达式支持
### RecyclerView 列表为空时的实现
在 RecyclerView 适配器中,当列表数据为空时,显示一个空视图(EmptyView)的实现方式:
1. 继承 BaseRecycleAdapter:
```kotlin
class YourAdapter : BaseRecycleAdapter() {
// 实现必要的方法
}
```
2. 在适配器中定义视图类型常量(已在 BaseRecycleAdapter 中定义):
```kotlin
companion object {
const val VIEW_TYPE_ITEM = 1
const val VIEW_TYPE_EMPTY = 0
}
```
3. 重写 getItemViewType 方法:
```kotlin
override fun getItemViewType(position: Int): Int {
if (dataList.isEmpty()) {
return VIEW_TYPE_EMPTY
}
return VIEW_TYPE_ITEM
}
```
4. 重写 getItemCount 方法:
```kotlin
override fun getItemCount(): Int {
if (dataList.isEmpty()) {
return 1 // 返回1表示显示空视图
}
return dataList.size
}
```
5. 在 onCreateViewHolder 中处理不同类型的视图:
```kotlin
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
if (viewType == VIEW_TYPE_EMPTY) {
val emptyView: ItemNoMoreBinding = DataBindingUtil.inflate(
(parent.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater)!!,
R.layout.item_no_more,
parent,
false
)
return ViewHolderEmpty(emptyView)
} else {
val binding = ItemListBinding.inflate(
parent.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater,
parent,
false
)
return ItemViewHolder(binding.root)
}
}
```
6. 重写 onBindViewHolder 方法:
```kotlin
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
if (holder is ViewHolderEmpty) {
// 空视图不需要绑定数据
return
}
// 绑定列表项数据
if (holder is ItemViewHolder) {
val item = dataList[position]
holder.bind(item)
}
}
```
7. 空视图的布局文件示例(item_no_more.xml):
```xml
```
这种实现方式的优点:
1. 统一的空视图处理逻辑
2. 支持自定义空视图样式
3. 不影响列表正常数据的显示
4. 便于维护和扩展
## 数据库结构
### GeneralLibrary 数据库
```kotlin
@Database(entities = [PassWordCardBean::class, CardData::class, ProjectDataBean::class], version = 1)
```
主要实体:
- PassWordCardBean: 密码卡数据
- CardData: 卡片数据
- ProjectDataBean: 项目数据
## 开发环境要求
- Android Studio Arctic Fox或更高版本
- JDK 8或更高版本
- Android SDK API 23或更高版本
- Gradle 7.0或更高版本
## 构建与运行
1. 克隆项目:
```bash
git clone [项目地址]
```
2. 在Android Studio中打开项目
3. 同步Gradle文件
4. 构建项目:
```bash
./gradlew build
```
5. 运行应用:
- 通过Android Studio运行
- 或使用命令行:`./gradlew installDebug`
## 模块说明
### BaseLibrary
基础功能库,提供:
- 基础Activity
- 通用工具类
- 基础UI组件
### GeneralLibrary
通用功能模块,包含:
- Room数据库实现
- 数据访问对象(DAO)
- 实体类定义
### 其他模块
- HenanlLibrary: 河南地区特定功能
- QiheAloneLibrary: 齐河单机版特定功能
- QiheOnlineLibrary: 齐河在线版特定功能
- OCRIDCardLibrary: 身份证识别功能
- EasySocket: Socket通信实现
- PickerViewLibrary: 选择器控件
## 自定义组件使用说明
### TitleBar 标题栏组件
TitleBar是一个自定义的标题栏组件,提供了左中右三个位置的文本和图片设置功能。
#### XML属性配置
```xml
```
#### 代码中使用
1. 设置文本和图片
```kotlin
titleBar.apply {
setLeftText("返回")
setLeftImage(R.drawable.ic_back)
setCenterText("标题")
setRightText("更多")
setRightImage(R.drawable.ic_more)
}
```
2. 点击事件监听
```kotlin
// 方式1:使用类型常量(推荐)
titleBar.setOnItemclickListner(TitleBar.ClickType_LEFT_IMAGE) { finish() }
titleBar.setOnItemclickListner(TitleBar.ClickType_RIGHT_TEXT) { showMenu() }
// 方式2:使用位置和类型常量(已废弃)
titleBar.setOnItemclickListner(TitleBar.IMAGE, TitleBar.LEFT) { finish() }
```
#### 点击类型常量说明
- `ClickType_LEFT_TEXT`: 左侧文本点击
- `ClickType_LEFT_IMAGE`: 左侧图片点击
- `ClickType_CENTER_TEXT`: 中间文本点击
- `ClickType_CENTER_IMAGE`: 中间图片点击
- `ClickType_RIGHT_TEXT`: 右侧文本点击
- `ClickType_RIGHT_IMAGE`: 右侧图片点击
#### 其他功能
```kotlin
// 设置右侧按钮状态
titleBar.setRightStatus(false) // 禁用右侧按钮
// 设置右侧图片可见性
titleBar.setRightIMGVisibility(View.GONE)
// 获取中间的TextView
val titleTextView = titleBar.getTitleTextView()
// 获取右侧布局
val rightLayout = titleBar.getLlRight()
```
#### 注意事项
1. 点击事件只有在对应的视图可见时才会生效
2. 设置文本或图片时,如果传入null或0,对应的视图将被隐藏
3. 组件默认使用垂直线性布局,确保在布局文件中设置合适的高度
## 注意事项
1. 数据库迁移
- 当修改数据库结构时,需要更新版本号
- 提供相应的Migration策略
2. 权限处理
- 确保在使用相关功能前申请必要权限
- 使用XXPermissions进行权限管理
3. 数据安全
- 敏感数据需要加密存储
- 注意用户数据的安全处理
## 贡献指南
1. Fork 项目
2. 创建特性分支
3. 提交更改
4. 推送到分支
5. 创建Pull Request
## 许可证
[添加许可证信息]
## 联系方式
[添加联系方式]