android - 列表视图可以处理太多项目吗?
问题描述
我有一个列表视图,其中包含来自 sql 中的外部数据库的项目,但我想知道我是否在该列表视图中添加了例如 1 亿个项目:
1.例如滚动时列表视图会滞后吗?
2.加载也需要时间吗?
我将不胜感激任何帮助!
过滤列表视图代码:
etSearch.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
String text = etSearch.getText().toString().toLowerCase(Locale.getDefault());
myAppAdapter.filter(text);
}
});
筛选:
public void filter(String charText) {
charText = charText.toLowerCase(Locale.getDefault());
itemArrayList.clear();
if (charText.length() == 0) {
itemArrayList.addAll(arraylist);
} else {
for (ClassListItems st : arraylist) {
if (st.getProname().toLowerCase(Locale.getDefault()).contains(charText)) {
itemArrayList.add(st);
}
}
}
notifyDataSetChanged();
}
}
解决方案
列表视图有不同的实现,更重要的是——适配器。
首先,您至少应该考虑RecyclerView
代替ListView
.
关于使用 RecyclerView 的官方文档在第一句话中为我们提供了这些信息(重点是我的):
如果您的应用需要显示基于大型数据集(或经常更改的数据)的元素滚动列表,则应使用本页所述的 RecyclerView。
此外,还有像ListAdapter这样的高级适配器,它使用强大的 DiffUtil工具,该工具内置在此适配器中(也可单独提供)来确定显示的项目和提交的项目显示之间的差异。它计算差异和请求以仅重绘或删除那些实际需要的项目,从而消除重绘已绘制布局的任何冗余工作。
所以这个问题的“简短”答案将是:
- 如果我们谈论 1 亿个项目 - Android 很可能无法将其保存在内存中,并且您的应用程序将崩溃
java.lang.OutOfMemoryError
。但是,是的,如果您正确实施您的部分,这些列表可以毫无问题地处理大量数据; - 很可能从数据库加载数据而不是从内存加载并在屏幕上绘制需要时间。这些视图仅显示适合屏幕的数据量。如果您有 10,000 个元素但只有 5 个,则屏幕只能容纳 5 个,则绘制的元素数量最多为 7 个(每边 +1 个离屏以平滑滚动)。也就是说,如果您使用 Android SDK 提供的视图。自定义视图可以绘制任何东西。
通常,除非数据变得非常大,否则大量数据不是问题。如果他们这样做 - 从永久存储加载是一个解决方案。我有在应用程序中使用 Realm ( iOS / Android ) 数据库的经验,这些数据库使它成为 Play Market 和 App Store 的方式。它的工作速度非常快,并且不关心您拥有的数据量。它使显示大量数据变得容易。
推荐阅读
- html - flex 在 html css 中不起作用
- css - 设置左侧(在容器中)对齐的轮播以到达屏幕右侧(在容器外)
- javascript - 检查语句是否为假或未定义的最佳方法是什么
- sql-server - 如何重新调整 SQL Server 数据库大小?
- linux - linux shell 执行 SQL 查询
- jestjs - 带有导入和 ES6 语法的玩笑
- excel - 显示是否打开但也显示票号
- java - 如何检查硒服务器上的测试问题
- r - 在绑定之前自动将一个数据框的所有列类型强制转换为另一个数据框的类型
- laravel - Xdebug 一个应用程序触发来自其他应用程序的调试连接?