赵明涛 5 days ago
parent
commit
f7b98bdd3a
  1. 4
      app/src/main/java/com/ouxuan/oxface/orderOX/adapter/OrderSelectionAdapter.java
  2. 2
      app/src/main/res/drawable/verify_button_background.xml
  3. 163
      docs/订单选择页面重构说明.md

4
app/src/main/java/com/ouxuan/oxface/orderOX/adapter/OrderSelectionAdapter.java

@ -184,7 +184,7 @@ public class OrderSelectionAdapter extends RecyclerView.Adapter<OrderSelectionAd
// 使用日期 // 使用日期
String usageDate = order.getOrder_type() == 0 ? String usageDate = order.getOrder_type() == 0 ?
(order.getEnd_time() != null ? formatDate(order.getEnd_time()) + "(" + getWeekDay(order.getEnd_time()) + ")" : "") : (order.getEnd_time() != null ? formatDate(order.getEnd_time()) + "(" + getWeekDay(order.getEnd_time()) + ")" : "") :
(order.getEnd_time() != null ? order.getEnd_time() + "到期" : "-到期");
(order.getEnd_time() != null ? (order.getEnd_time() + "到期") : "-到期");
addInfoLine(holder, "使用日期:", usageDate, false); addInfoLine(holder, "使用日期:", usageDate, false);
} }
@ -209,7 +209,7 @@ public class OrderSelectionAdapter extends RecyclerView.Adapter<OrderSelectionAd
addInfoLine(holder, "进场状态:", status, false); addInfoLine(holder, "进场状态:", status, false);
// 有效期 // 有效期
String validity = order.getEnd_time() != null ? order.getEnd_time() + "到期" : "-到期";
String validity = order.getEnd_time() != null ? (order.getEnd_time() + "到期") : "-到期";
addInfoLine(holder, "有效期:", validity, false); addInfoLine(holder, "有效期:", validity, false);
} }

2
app/src/main/res/drawable/verify_button_background.xml

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" <shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle"> android:shape="rectangle">
<solid android:color="#009874" />
<solid android:color="#FF6B35" />
<corners <corners
android:topLeftRadius="0dp" android:topLeftRadius="0dp"
android:topRightRadius="0dp" android:topRightRadius="0dp"

163
docs/订单选择页面重构说明.md

@ -0,0 +1,163 @@
# 订单选择页面重构说明
## 项目信息
- 项目名称: oxFaceAndroid
- 重构时间: 2025-09-09
- 重构模块: 订单核销选择页面
## 重构概述
本次重构主要是将订单选择核销页面的UI设计从简单的列表样式改为票券样式,参考了原有的uniapp Vue页面设计,使界面更美观且功能更完整。
## 架构设计
### 1. 文件结构
```
orderOX/
├── OrderSelectionActivity.java # 主Activity,负责页面逻辑
├── adapter/
│ └── OrderSelectionAdapter.java # 重构的适配器,支持多种订单类型
├── model/
│ └── OrderVerificationData.java # 扩展的数据模型,支持更多字段
└── res/
├── layout/
│ ├── activity_order_selection.xml # 主页面布局
│ └── item_order_selection.xml # 重构的列表项布局(票券样式)
└── drawable/
├── coupon_background.xml # 票券背景
├── order_type_background.xml # 订单类型标签背景
├── verify_button_background.xml # 核销按钮背景
├── dashed_line.xml # 虚线分割
└── many_enter_tag_background.xml # 多次进出标签背景
```
### 2. 主要组件
#### OrderSelectionAdapter(重构)
- **职责**: 根据不同订单类型动态显示相应的信息
- **支持的订单类型**:
- `order_type = 0`: 场次订单
- `order_type = 1`: 人次票订单
- `order_type = 3`: 年月卡订单
- `order_type = 5`: 课程订单
#### 数据模型扩展
- 扩展了`OrderInfo`类,新增课程相关字段:
- `kind`: 课程类型
- `time`: 上课时间
- `coach`: 教练
- `addr`: 地点
- `venue_name`: 场馆名称
- `start`: 开始时间
## 使用示例
### 1. 订单类型显示逻辑
```java
// 根据订单类型显示不同的标签
private String getOrderTypeLabel(int orderType) {
switch (orderType) {
case 0: return "场\n次";
case 1: return "人\n次";
case 3: return "年\n月\n卡";
case 5: return "课\n程";
default: return "订\n单";
}
}
```
### 2. 动态信息显示
```java
// 根据订单类型设置详细信息
private void setupOrderDetails(OrderViewHolder holder, OrderVerificationData.OrderItem order) {
holder.layoutOrderDetails.removeAllViews();
int orderType = order.getOrder_type();
if (orderType == 0 || orderType == 1) {
setupFieldInfo(holder, order); // 场次/人次票信息
} else if (orderType == 3) {
setupCardInfo(holder, order); // 年月卡信息
} else if (orderType == 5) {
setupCourseInfo(holder, order); // 课程信息
}
}
```
### 3. 票券样式布局
```xml
<!-- 票券样式的主容器 -->
<RelativeLayout
android:background="@drawable/coupon_background"
android:minHeight="150dp">
<!-- 左侧订单类型标识 -->
<RelativeLayout android:id="@+id/layout_order_type">
<TextView android:background="@drawable/order_type_background" />
</RelativeLayout>
<!-- 虚线分割 -->
<View android:background="@drawable/dashed_line" />
<!-- 右侧订单信息 -->
<LinearLayout android:id="@+id/layout_order_info">
<!-- 动态添加的信息行 -->
</LinearLayout>
<!-- 右上角核销按钮 -->
<TextView android:background="@drawable/verify_button_background" />
</RelativeLayout>
```
## 优势分析
### 1. 视觉优势
- **票券样式**: 采用仿真票券设计,增强视觉效果
- **色彩搭配**: 渐变背景和明亮的核销按钮,层次分明
- **类型标识**: 不同订单类型有清晰的视觉区分
### 2. 功能优势
- **多类型支持**: 完整支持4种订单类型的信息展示
- **动态显示**: 根据订单类型动态生成相应的信息字段
- **交互友好**: 整个列表项可点击,核销按钮独立响应
### 3. 维护优势
- **代码复用**: 通过`addInfoLine`方法统一信息行的创建逻辑
- **易扩展**: 新增订单类型只需在switch语句中添加新分支
- **数据适配**: 支持多种JSON数据格式的解析
## 优化建议
### 1. 性能优化
- 考虑使用ViewHolder中的静态布局代替动态创建,减少内存开销
- 对于长列表,可考虑实现列表项的回收复用机制
### 2. 用户体验优化
- 添加列表项点击的视觉反馈动画
- 考虑添加下拉刷新功能
- 对于网络错误,提供重试机制
### 3. 代码质量优化
- 可将票券样式相关的尺寸和颜色提取到styles.xml中统一管理
- 考虑使用数据绑定(DataBinding)简化视图更新逻辑
- 添加单元测试覆盖适配器的核心逻辑
## 技术细节
### 1. 关键修复点
- **年月卡使用次数**: 正确显示`每天可使用X次,今天已使用Y次`
- **有效期格式**: 统一使用`时间 + "到期"`的格式
- **核销按钮颜色**: 改为`#FF6B35`橙色,增强视觉对比度
### 2. 布局要点
- 使用RelativeLayout实现复杂的票券布局
- 通过layer-list实现券形背景效果
- 动态创建LinearLayout来适应不同订单类型的信息显示
### 3. 数据处理
- 支持三层JSON解析策略,兼容多种数据格式
- 扩展数据模型以支持课程等新增订单类型
- 完善了订单信息的格式化显示逻辑
## 总结
本次重构成功将订单选择页面从简单的列表样式升级为美观的票券样式,不仅提升了视觉效果,还完善了多种订单类型的支持。新的设计更好地符合了用户的期望,同时保持了良好的代码可维护性和扩展性。
Loading…
Cancel
Save