java - Android过滤项目列表
问题描述
在 Android 应用程序中,我有一个由名称和类别组成的项目列表。项目和类别存储在 Android 的 SQLite 数据库中。
class Item{
Long id;
String name;
Category category;
}
class Category{
Long id;
String name;
}
- 用户可以使用对话框中显示的 ComboBox 列表选择类别
- 然后按名称搜索所选类别的项目。
- 当用户在类别对话框中单击“确定”按钮时,列表应按类别过滤
- 并在用户在 SearchView 中键入一些文本时按名称。
如何以正确的方式进行过滤?
- 我认为在 SearchView 中输入的每个字符上过滤类别和名称在性能方面并不是一个好方法。
- 另一方面,分别过滤两个属性会产生额外的列表:
-
- 完整列表
-
- 按类别过滤的完整列表中的项目
- 3:先前列表中的项目按名称过滤。
-
- 我想到的另一个选项是在 SearchView 文本更改上查询数据库以获得所需的结果,而不是过滤完整列表。
谢谢
解决方案
这不是一个简单的问题。所有开发人员的做法都不同。我建议几件事:
- 仅在数据库上进行一次选择,当用户编写前 1 个或 2 个字符或选择类别时。
- 记住从数据库列表中选择。让我们将其命名为 - originalList。可见列表保留在过滤列表等其他对象上。
- 每次都使用一些东西来避免过滤。如果您知道什么是反应式编程,您可以使用它的功能。如果您想以老式的方式进行操作,例如,您可以创建一个过滤任务/作业,当新的过滤顺序出现时,该任务/作业将被取消。这样,您总是有 0 或 1 个正在进行的过滤。
- 如果您的查询是由一项任务/作业处理的,那么过滤需要多少数据并不重要。如果没有为类别或名称设置任何内容,它还必须能够使用空属性。
- 当用户添加新要求时 - 过滤过滤列表进行优化。
- 请记住,当您清除字母时 - 列表也必须更改。这次您别无选择,必须过滤 originalList 或在数据库上进行选择。
但这是最复杂的方式,当项目列表可能非常大时使用。否则,您可以简单地从 SQLite 数据库中的表中选择所有对象作为原始列表,然后在 Java 代码中对其进行处理。
这样做的方式取决于环境,所以项目的数量、列的数量、名称的长度等。试着找到一种适合旅游情况的方式——我敢肯定,网络上有很多关于它的文章。
推荐阅读
- blazor-server-side - Blazor - 应用程序可能不再响应,直到重新加载。重新加载
- python - KeyError 熊猫
- r - 如何将预先计算的 X 和 Y 轴的标准误差添加到 r 中的散点图中?
- python - Traceback(最近一次调用最后一次)-Python
- python - Django - 从查询集中排除对象导致“表达式树太大”
- xcode - AppleScript 按钮打开另一个窗口
- python - OpenCV 代码在 C++ 中比 Python 使用非常高的 CPU
- java - Maven 使用来自工作区而不是 .m2 文件夹的依赖项
- ios - 如何在拆分视图控制器中将数据从详细信息发送到主控
- xamarin.forms - 将引脚添加到 Mapsui(Xamarin 表单)时出现异常