mirror of
https://github.com/Silent1566/webhtv.git
synced 2026-10-18 07:09:16 +00:00
refactor(list): 把「列表空了但页面留白」收敛成不可能忘的钩子
同一个缺陷在本仓库出现了 6 处、跨两个 flavor:删除/清空之后宿主忘了驱动状态机,
列表空了但页面留白——连空态都不出现。形状完全一样:
mAdapter.remove(item, () -> { if (count == 0) setDelete(false); ... }); // 忘了驱动
mAdapter.clear() // 同样忘了
根因不是手滑,而是责任放错了地方:把「驱动状态机」留给每一个调用点,而调用点会不断增加
(单条删除、删除全部、删除后刷新……)。前几批都是发现一处补一处,所以第 2、第 4 处才会在
补完之后才暴露。
- BaseDiffAdapter 新增 OnCountChanged 钩子与 setOnCountChanged;两个 setItems 重载都改走
统一的 afterUpdate 收尾(含 Callback 重载的无变化分支)。钩子必须挂在 differ.submitList
的**回调里**——AsyncListDiffer 是异步的,提前读 getItemCount() 会拿到旧值;
- 四个宿主(电视/手机 × 收藏/历史)在 setRecyclerView 里注册一次,并删掉原先手写的 8 处
showContent(true, ...)——否则代码里会同时存在两套机制,将来有人可能误删钩子;
- 电视端 HistoryActivity 的「删除全部」因此被修复(它本来就只是 mAdapter.clear());
- 新增跨 flavor 契约 ListStateConvergenceContractTest 4 项:钩子存在、两个重载都触发且
时机在 diff 回调里、四个宿主都注册且只允许出现一次 showContent(true,(就是注册那行)、
mAdapter.clear() 之后不得再有手写驱动;
- 同步更新 TV-4 与 M-1 里两条因本批而过时的断言(它们原先断言「回调里手写了 showContent」,
而那正是本批要废除的模式)——电视端那条在首轮测试里失败,正是它提醒了我。
未注册钩子时行为与改动前完全一致,因此其它使用 BaseDiffAdapter 的页面不受影响。
验证:手机端定向测试 BUILD SUCCESSFUL;电视端首轮因上述过时断言失败,同步后
BUILD SUCCESSFUL(4m35s);两个 flavor 均 assemble 成功;真机 192.168.50.3:5561
(leanback)打开历史页(列表为空)空态正常出现——而这一页的显式调用已被删除,
所以是钩子在驱动,属于决定性检查。
未单独实测:删除后钩子驱动(历史数据已空,无可再删),与首次加载共用同一收尾点。
详见 docs/LIST-STATE-CONVERGENCE-20261013.md §6.4。
环境限制:本会话无可用 bash,check_ui_tokens.sh 与 task_guard.sh 无法执行,
按同等意图手工暂存/提交/打 tag。
This commit is contained in:
parent
c44b8ce7d8
commit
8168dab809
9 changed files with 310 additions and 56 deletions
Loading…
Add table
Add a link
Reference in a new issue