1

我有一个屏幕,VerticalFieldManager 用于保存自定义管理器列表。

该屏幕还包含一个充当搜索字段的 EditField,因此当用户输入一些文本时,我的应用程序会循环遍历一组自定义管理器,并将输入的文本与数组中每个管理器的文本进行比较。

如果来自管理器的文本与输入的字符串匹配,我将该自定义管理器附加到 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)时,这可以正常工作,否则应用程序会变得太慢。

如何针对大量自定义管理器优化我的代码?例如,如果数组包含 600 个元素。

我真的需要改进这个功能。我刚刚阅读了有关 BlackBerry 中的 ListField 的信息,但是由于我已经完成了这段代码,也许我不需要用 ListFields 重写所有内容。

提前致谢!

4

2 回答 2

1

在这里回答了 BB 论坛上的类似问题:

如何改进此搜索功能 over-a-VerticalFieldManager

我会考虑三个可行的选择:

  1. 使用 addAll() 一次添加所有管理器,从而显着减少布局时间
  2. 使用“分页”,所以你只添加前 15 个,如果用户也希望你添加后面的选择
  3. 使用列表字段

前 2 个选项将使您能够保留当前的 ​​Manager 代码。

按照给定的顺序尝试这些选项,让我们知道哪些适合您。

更新

鉴于选项 1 对您不起作用,并且您不允许执行选项 2,那么也许我可以建议选项 1.5。仅添加前 25 个左右,但添加一些滚动控件,以检测您何时接近 VFM 的末尾以及当您在 1 个屏幕内时,它会添加更多内容。这将导致此时出现滚动故障,但列表看起来是连续的,而不会在开始时受到巨大的打击。

我认为没有人会滚动浏览 600 个条目。如果您的搜索显示找到的数字,这将为您的用户提供指示,如果数字太大,他们可能会尝试不同的搜索。而且由于您没有添加每一项,因此您大大加快了流程。

对此的一种变体是在用户将焦点从 EditField 移到列表上之前不添加所有条目。

您可以考虑在线程中异步完成此“搜索”过程的另一件事,如果用户使用一些新输入更新编辑字段,则取消它。

或者,如果选项 1 对您不起作用,我建议您最多尝试添加 10,看看故障是否仍然存在。如果是这样,那么我怀疑您的字段处理中存在问题,例如一些绘制循环或布局循环。将此与添加 10 个标签字段所花费的时间进行比较。也许我们可以优化您的自定义管理器中的处理来克服这个问题。

进一步编辑

我有一个随机的想法,也许限制 VFM 的高度可能会限制完成的绘画。不正确,我已经测试过,唯一绘制的字段是可见的。因此,性能受到的影响是布局而不是油漆。

于 2013-11-14T15:52:20.023 回答
1

更改处理搜索的代码,如下所示:

_editField.setChangeListener(new FieldChangeListener() {            
    public void fieldChanged(Field field, int context) {
        String text = _editField.getText().toLowerCase();

        // Delete the vertical field manager
        delete(_vfmCellPlaces);

        _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());
            }
        }

        // Add the vertical field manager
        add(_vfmCellPlaces);
    }
});

解释:

在当前显示的管理器上调用每个add()delete()方法时,都会调用更新布局。因此,如果您逐个添加 50 个管理器,您最终将调用他们的sublayout()方法 1+2+3+...+50 次,即 50x49/2,即 1225 次。

如果你一个一个地添加 600 个经理,你最终会调用sublayout()179700 次,这可能会让你的手机爬起来。

updateLayout()此外,在这种情况下不需要显式调用。只有当字段的内容在其经理不知情的情况下发生更改时才需要使用它。

于 2013-11-17T15:19:52.820 回答