seven332 / Nimingban

[DEPRECATED] A Nimingban Client
Apache License 2.0
309 stars 51 forks source link

Forum Auto Sorting #106

Closed dd-fantasy closed 5 years ago

dd-fantasy commented 5 years ago

根据访问频率对版块自动排序。

  1. 升级数据库,对每个版块记录点击次数(frequency)。
  2. 每次从右边栏主动点击一个版块(ListActivity处理),frequency + 1。打开程序(NMBApplication)且过去24小时未老化时进行老化(aging),frequency / 2。访问过的版块frequency不会小于1,未访问过的版块frequency为0。
  3. 引入选项开关。从数据库读取版块列表时(右边栏加载或者发新串时)根据设置选择是否排序。DB的相应方法也要修改签名。注意:选项关闭时依然在计数和老化。

值得商榷的地方

  1. 计数和老化算法是根据缓存老化算法拍脑袋想出来的,效果未知。
  2. 右边栏不重新读取就不会更新顺序。个人觉得这样就好。
  3. 启动的第一个版块可能换来换去。(时间线选手の错愕)也许需要一个置顶版块的功能。

另祝新年好。

seven332 commented 5 years ago

板块排序不就没有意义了。

dd-fantasy commented 5 years ago

有人(我)会懒得排序。这个默认是关闭的,想要手动排序的不受影响的。

seven332 commented 5 years ago

如果启用了自动排序的话,就把手动排序入口隐藏了吧,或者改成能手动置顶的。

dd-fantasy commented 5 years ago

目前还是先隐藏手动排序入口吧。 置顶的方法我再想想。

dd-fantasy commented 5 years ago

开启自动排序时,允许用户进入版块排序界面,选择最多一个版块置顶,保证启动程序时进入固定板块。 此时的版块排序界面中,置顶的版块会保持在最上面,其余版块依照 frequency 排序。用星星符号代替原来的排序 handle。同时只有一个版块能被置顶,所以同时只有一个星星被点亮。 星星符号是 Google 在 APL 2.0 下开源的。 实现上,限定 frequency 在 [0, 2^15) 的范围内,将第 16 位设置为置顶 flag。因此置顶版块的 frequency 必将大于其余版块,依照 frequency 排序时会自然地排在第一。

顺带修了排序 handle 在暗色模式下颜色不对的小问题。

seven332 commented 5 years ago
  1. 默认置顶时间线;
  2. 在板块管理界面添加自动排序切换开关;

疑问

  1. 是否需要支持多个置顶板块;
  2. 应用启动时,默认选择的板块不会添加计数,是否对其不公平;
dd-fantasy commented 5 years ago

多个置顶我也细想过了。如果要做多个置顶,最大问题就是这多个置顶如何排序。

  1. 还是按 frequency 排。那么要选一个“置顶的置顶”固定在第一?剩下的继续浮动,和没有置顶差别不大。
  2. 固定顺序。那排序界面就会很复杂。并且几乎直接否定了自动排序的意义。

所以这两种(算上我这个仅选一个置顶就是三种)方法效果都不算最好,毕竟众口难调。另外我觉得,这两种方法都会把排序系统弄得复杂,而自动排序主要是面向不想动手管理版块顺序的用户,引入过多手动操作可能未必满足他们的需要。

我的三种方案列在上面了,看你觉得哪种好吧。

其他都可以有。 默认版块没有 +1 是考虑不当。 开关放在版块管理界面的话,那就把设置里的去掉吧。 话说我觉得现在选项多起来了有点混乱,河马你看是不是分个组?

seven332 commented 5 years ago

还是就置顶一个板块。

选项是指设置选项吗?目前先不改。

dd-fantasy commented 5 years ago

给星星加了引导教程。

往排序界面引入开关遇到了一些麻烦。使用 PreferenceFragment 的话似乎有 support 库版本的问题。把 SortForumsActivity 的 class 换成安卓自己的设置界面的话,通过 ToolbarActivityHelper 建立 layout 就会不兼容。 还是自己写个 View 吧,模仿设置里的样子。

seven332 commented 5 years ago

你想怎么加开关?为什么还要 PreferenceFragment ?

dd-fantasy commented 5 years ago

和设置界面一样的开关? 设置界面是 PreferenceActivity 的子类,开关的 UI 和回调是自动生成的吧。

seven332 commented 5 years ago

用 SwitchCompat 就行了。

dd-fantasy commented 5 years ago

把自动排序选项搬到了板块排序界面。新的 UI: Screenshot

seven332 commented 5 years ago

为什么需要重启?

开关的位置感觉有点怪,能不能把开关就放到列表第一行,要改一下 onGetItemDraggableRange() 和 onCheckCanStartDrag() 。

dd-fantasy commented 5 years ago

是说像 RightDrawer 里面的常用串一样一起放在列表里?

seven332 commented 5 years ago

是的,放在最上面。

dd-fantasy commented 5 years ago

所有根据 position 从 mLazyList 取东西的地方要改成 position - 1。 追加 AutoSortingSwitchHolder extends RecyclerView.ViewHolder 来放开关,把 Adapter 的基类改成RecyclerView.Adapter<RecyclerView.ViewHolder>

感觉实现不够优雅(),河马觉得这样可以吗。 另外,现在的 UI: Screenshot

seven332 commented 5 years ago

能不能弄成这样?让眼睛图标和开关对齐,文字也对齐。 无标题

dd-fantasy commented 5 years ago

等一等,我犯傻了,这个实现太丑了,应该还有别的方法。让我试试看。

seven332 commented 5 years ago

多谢