我有一个带有 VerticalFieldManager
的屏幕
用于保存自定义管理器列表。
屏幕还包含一个编辑字段 充当搜索字段,因此当用户 输入一些文本,我的应用程序在数组上循环 自定义管理器并将输入的文本与来自的文本进行比较 阵列中的每个经理。
如果经理的文本匹配 输入的字符串,我将该自定义管理器附加到 垂直字段管理器。
这些是我的代码的相关部分:
EditField _editField;
TempBeanPlaces [] _placesList;
VerticalFieldManager _vfmCellPlaces;
...
这是TemBeanPlaces 的构造函数:
public TempBeanPlaces(String pPlaceName,
CellPlaceManager pCellPlaceManager) {
placeName = pPlaceName;
cellPlaceManager = pCellPlaceManager;
}
...
此代码处理搜索:
_editField.setChangeListener(new FieldChangeListener() {
public void fieldChanged(Field field, int context) {
String text = _editField.getText().toLowerCase();
_vfmCellPlaces.deleteAll();
for (int i = 0; i < _placesList.length; i++) {
TempBeanPlaces tempBeanPlaces = _placesList[i];
if(tempBeanPlaces.getPlaceName().toLowerCase().indexOf(text) != -1) {
_vfmCellPlaces.add(tempBeanPlaces.getCellPlaceManager());
}
}
updateLayout();
}
});
当数组 _placesList 不太大(例如长度为 50)时,这可以正常工作, 否则应用程序会变得太慢。
How could I optimize my code for large amounts of custom managers?. For example, in case the array contains 600 elements.
我真的需要改进这个功能。我刚刚读到有关 BlackBerry 中的 ListField 的内容, 但既然我已经完成了这段代码,也许我不需要用 ListFields 重写所有内容。
提前致谢!
最佳答案
在 BB 论坛上回答了类似的问题:
How-to-improve-this-search-feature-over-a-VerticalFieldManager
我会考虑三个可行的选择:
- 使用 addAll() 一次添加所有管理器,这样显着 减少布局时间
- 使用“分页”,因此您只需添加前 15 个,然后再添加 如果用户也希望您进行选择
- 使用列表字段
前 2 个选项将使您能够保留当前的管理器代码。
按照给定的顺序尝试这些选项,并让我们知道哪一个适合您。
更新
鉴于选项 1 对您不起作用,并且不允许您执行选项 2,那么也许我可以建议选项 1.5。仅添加前 25 个左右,但添加一些滚动控件来检测您何时接近 VFM 的末尾,以及当您在 1 个屏幕内时,它会添加更多内容。这将导致此时出现滚动故障,但列表将看起来连续,而不会在开始时出现巨大的点击。
我认为没有人会滚动浏览 600 个条目。如果您的搜索显示找到的数字,这将为您的用户提供指示,如果数字太大,他们可能会尝试不同的搜索。而且由于您没有添加每一个项目,因此您显着加快了该过程。
对此的一种变体是,直到用户将焦点从 EditField 移到列表上才添加所有条目。
您可以考虑在线程中异步完成此“搜索”过程的另一件事,并在用户使用一些新输入更新编辑字段时取消它。
或者,如果选项 1 不适合您,我可以建议您尝试最多添加 10 个,然后看看故障是否仍然存在。如果是这样,那么我怀疑您的字段处理存在问题,例如某些绘制循环或布局循环。将此与添加 10 个 LabelField 所需的时间进行比较。也许我们可以优化您的自定义管理器中的处理来克服这个问题。
进一步编辑
我突然想到,也许限制 VFM 的高度可能会限制所完成的绘画。不正确,我已经测试过,唯一绘制的字段是那些可见的字段。因此,性能受到影响的是布局而不是油漆。
关于java - BlackBerry - 如何通过包含自定义管理器的 VerticalFieldManager 改进此搜索功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19979640/