我制作了一个简单的 cooking 应用程序,用户可以在其中选择多个项目并获取包含所选成分的食谱列表。有两种选择成分的模式:通过标签和通过复选框。在第二种模式下,您可以输入所需的成分数量,然后点击“随机化”按钮或只需按“选择/取消选择所有成分”按钮。问题始于超过 300 个复选框(具体来说是 386 个)。代码运行良好,但 GUI 保持卡住的时间过长。
所以,我有 HashMap <String/CheckBox> checkBoxHashMap
,其中 key 是复选框的标签。要全选(与取消全选相同,但具有 false
值)我正在使用此代码:
for (CheckBox chkBox: checkBoxHashMap.values()) {
chkBox.setChecked(true);
}
我尝试使用的是:
1)使用ProgressBar
.问题是,ProgressBar
的动画在选择/取消选择所有 CheckBox
期间被卡住es。另外,大多数时候ProgressBar
甚至没有出现(在所有 ProgressBar
es 被选中后,我隐藏了 CheckBox
;
2) 使用chkBox.jumpDrawablesToCurrentState();
打电话后立即 chkBox.setChecked(true);
这是我能获得的最好的性能,但它仍然落后并且不能让我满意。
我想要的:
我想让它对用户更友好(我相信卡住的 GUI 根本不是用户友好的)。我想实现软切换开/关所有复选框(类似链的动画)或其他类似禁用动画并在所有 CheckBox
之后启用它的功能。 es 已经改变了它们的状态并重新绘制它们。
有没有办法实现这样的目标?
最佳答案
老实说,如果我是你,我会使用 RecyclerView
来处理这种情况。
同时在屏幕上显示 300 个项目从来都不是一个好主意:用户不可能一次需要所有的项目,系统也不应该处理这种负载。
这个概念是回收 View ,这意味着一旦 View 变得不可见,它所需的资源就会被释放,并且可以重新用于另一个数据单元。
我做了介绍article关于 RecyclerView 有很多例子,看看
在您的特定情况下,只需为复选框制作适当的数据集并异步更改它,在 UI 线程上使用此操作的结果只是为了更新 RCV(与您现在拥有的操作相比,这是一个非常轻量级的操作)
关于java - 通过打开/关闭 300 多个复选框来改善用户体验,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51846063/