feat: 任务页面按原型图V3适老化重设计

按状态显示不同布局:
- 待抢单:任务名+地点+时间+积分+备注 → 帮助决策
- 待打卡(有场景):任务名+备注+指引块(去哪+怎么做) → 两段式指引
- 待打卡(无场景):任务名+绿色引导块 → 正向说明
- 待完成:任务名+备注+打卡时间大字确认 → 安心感
标题栏三栏:返回+状态名+页码
新增指引块drawable(orange/blue/green/note)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
dongliang
2026-04-28 13:09:04 +09:30
parent 354a2ab124
commit 2f0fc675d2
6 changed files with 273 additions and 163 deletions

View File

@@ -198,106 +198,111 @@ class TaskListFragment : BaseFragment<FragmentTaskListBinding>() {
// ===== UI 显示 =====
/**
* 显示任务详情(居中布局,老年人大字优化
* 重点突出:状态 → 任务名 → 地点 → 时间/积分
* 显示任务详情(按原型图V3适老化设计
* 按状态显示不同内容布局
*/
private fun displayDetail(detail: TaskDetail) {
binding.taskContent.visibility = View.VISIBLE
binding.tvEmpty.visibility = View.GONE
binding.loadingWrap.visibility = View.GONE
// 标题第X/Y个任务
binding.tvTitle.text = "${taskIndex + 1}/${taskList.size}个任务"
// 状态标签(最顶部,带背景色)
when (detail.status) {
2 -> {
binding.tvStatus.text = "待抢单"
binding.tvStatus.setTextColor(requireContext().getColor(R.color.primary))
binding.tvStatus.setBackgroundResource(R.drawable.bg_pill_blue)
}
3 -> {
binding.tvStatus.text = "待打卡"
binding.tvStatus.setTextColor(requireContext().getColor(R.color.warning))
binding.tvStatus.setBackgroundResource(R.drawable.bg_pill_orange)
}
4 -> {
binding.tvStatus.text = "进行中"
binding.tvStatus.setTextColor(requireContext().getColor(R.color.success))
binding.tvStatus.setBackgroundResource(R.drawable.bg_pill_green)
}
else -> {
binding.tvStatus.text = "已完成"
binding.tvStatus.setTextColor(requireContext().getColor(R.color.text_secondary))
binding.tvStatus.background = null
}
// 标题栏:状态名
binding.tvTitle.text = when (currentStatus) {
2 -> "接单池"
3 -> "待打卡"
4 -> "待完成"
else -> "任务"
}
// 页码
binding.tvPageNum.text = "${taskIndex + 1}/${taskList.size}"
// 任务名(最大最醒目
// 任务名(始终显示,最大最突出
binding.tvTaskName.text = detail.displayName
// 地点
if (detail.hasPosition) {
binding.tvPosition.text = detail.positionText
binding.tvPosition.visibility = View.VISIBLE
} else {
binding.tvPosition.visibility = View.GONE
}
// 先隐藏所有可选区域
binding.tvPosition.visibility = View.GONE
binding.tvTimeInfo.visibility = View.GONE
binding.tvPoints.visibility = View.GONE
binding.tvNote.visibility = View.GONE
binding.blockGoWhere.visibility = View.GONE
binding.blockHowTo.visibility = View.GONE
binding.blockNoScene.visibility = View.GONE
binding.blockCheckedIn.visibility = View.GONE
// 时间信息(派单时间 + 截止时间合并显示)
val timeInfo = StringBuilder()
if (detail.sendTime.isNotEmpty()) timeInfo.append("${detail.sendTime} 派单")
if (!detail.expireTime.isNullOrEmpty()) {
if (timeInfo.isNotEmpty()) timeInfo.append("\n")
timeInfo.append("截止 ${detail.expireTime}")
}
if (!detail.preFinishTime.isNullOrEmpty()) {
if (timeInfo.isNotEmpty()) timeInfo.append("\n")
timeInfo.append("要求 ${detail.preFinishTime} 完成")
}
if (timeInfo.isNotEmpty()) {
binding.tvTimeInfo.text = timeInfo
binding.tvTimeInfo.visibility = View.VISIBLE
} else {
binding.tvTimeInfo.visibility = View.GONE
}
// 按状态显示不同内容
when (detail.status) {
// ===== 待抢单:展示完整信息帮助决策 =====
2 -> {
// 地点
if (detail.hasPosition) {
binding.tvPosition.text = "📍 ${detail.positionText}"
binding.tvPosition.visibility = View.VISIBLE
}
// 时间
if (detail.sendTime.isNotEmpty()) {
binding.tvTimeInfo.text = "🕐 ${detail.sendTime}"
binding.tvTimeInfo.visibility = View.VISIBLE
}
// 积分
if (detail.point > 0) {
binding.tvPoints.text = "${detail.pointText} 积分"
binding.tvPoints.visibility = View.VISIBLE
}
// 备注/描述
showNote(detail)
}
// 积分大于0才显示
if (detail.point > 0) {
binding.tvPoints.text = "积分 ${detail.pointText}"
binding.tvPoints.visibility = View.VISIBLE
} else {
binding.tvPoints.visibility = View.GONE
// ===== 待打卡:指引去哪+怎么做 =====
3 -> {
// 备注
showNote(detail)
if (detail.hasPosition) {
// 有场景:两段式指引
binding.tvGoWhereTitle.text = "前往 ${detail.positionText}"
binding.blockGoWhere.visibility = View.VISIBLE
binding.blockHowTo.visibility = View.VISIBLE
} else {
// 无场景:绿色引导
binding.blockNoScene.visibility = View.VISIBLE
}
}
// ===== 进行中/待完成:打卡确认+完成指引 =====
4 -> {
// 备注
showNote(detail)
// 打卡确认时间
if (!detail.confirmTime.isNullOrEmpty()) {
val time = detail.confirmTime.split(" ").lastOrNull() ?: detail.confirmTime
binding.tvCheckinTime.text = time
} else {
binding.tvCheckinTime.text = ""
}
binding.blockCheckedIn.visibility = View.VISIBLE
}
// ===== 其他状态 =====
else -> {
if (detail.hasPosition) {
binding.tvPosition.text = "📍 ${detail.positionText}"
binding.tvPosition.visibility = View.VISIBLE
}
}
}
}
// 上报人type 3/4
if (detail.createName.isNotEmpty() && detail.taskType in listOf(3, 4)) {
binding.tvCreatorName.text = "上报人:${detail.createName}"
binding.tvCreatorName.visibility = View.VISIBLE
} else {
binding.tvCreatorName.visibility = View.GONE
/** 显示备注/描述content 或 taskRequire */
private fun showNote(detail: TaskDetail) {
val note = when {
!detail.taskRequire.isNullOrEmpty() -> detail.taskRequire
detail.content.isNotEmpty() -> detail.content
else -> null
}
// 协作人
binding.tvWorkers.visibility = View.GONE // TODO: workTogether 结构待确认
// 描述
if (detail.content.isNotEmpty()) {
binding.tvDescription.text = detail.content
binding.tvDescription.visibility = View.VISIBLE
} else {
binding.tvDescription.visibility = View.GONE
}
// 提示条(任务要求 或 打卡提示)
if (!detail.taskRequire.isNullOrEmpty()) {
binding.tvHint.text = detail.taskRequire
binding.tvHint.visibility = View.VISIBLE
} else if (detail.status == 3 && detail.hasPosition) {
binding.tvHint.text = "请将手表贴近打卡信标"
binding.tvHint.visibility = View.VISIBLE
} else {
binding.tvHint.visibility = View.GONE
if (note != null) {
binding.tvNote.text = note
binding.tvNote.visibility = View.VISIBLE
}
}