Java BlackBerry-如何在拥有自定义管理器的VerticalFieldManager上改进此搜索功能

Java BlackBerry-如何在拥有自定义管理器的VerticalFieldManager上改进此搜索功能,java,blackberry,Java,Blackberry,我有一个带有VerticalFieldManager 用于保存自定义管理器列表 屏幕还包含一个编辑字段,该字段 行为类似于搜索字段,因此当用户 输入一些文本,我的应用程序在数组上循环 并将输入的文本与来自的文本进行比较 阵列中的每个管理器 如果管理器中的文本匹配 输入的字符串,我将该自定义管理器附加到 垂直场管理器 这些是我的代码的相关部分: EditField _editField; TempBeanPlaces [] _placesList; VerticalFieldManager _vf

我有一个带有
VerticalFieldManager
用于保存自定义管理器列表

屏幕还包含一个编辑字段,该字段 行为类似于搜索字段,因此当用户 输入一些文本,我的应用程序在数组上循环 并将输入的文本与来自的文本进行比较 阵列中的每个管理器

如果管理器中的文本匹配 输入的字符串,我将该自定义管理器附加到 垂直场管理器

这些是我的代码的相关部分:

EditField _editField;
TempBeanPlaces [] _placesList;
VerticalFieldManager _vfmCellPlaces;
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();
    }
});

这是TemBeanPlaces:

EditField _editField;
TempBeanPlaces [] _placesList;
VerticalFieldManager _vfmCellPlaces;
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();
    }
});

此代码处理搜索:

EditField _editField;
TempBeanPlaces [] _placesList;
VerticalFieldManager _vfmCellPlaces;
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();
    }
});
\u editField.setChangeListener(新字段ChangeListener(){
公共无效字段已更改(字段,int上下文){
字符串文本=_editField.getText().toLowerCase();
_vfmCellPlaces.deleteAll();
对于(int i=0;i<\u placesList.length;i++){
TempBeanPlaces TempBeanPlaces=_placesList[i];
if(tempBeanPlaces.getPlaceName().toLowerCase().indexOf(text)!=-1){
_添加(tempBeanPlaces.getCellPlaceManager());
}
}
updateLayout();
}
});
当数组_placesList不太大(例如,长度为50)时,此功能正常, 否则,应用程序会变得太慢

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

我真的需要改进这个特性。我刚刚在BlackBerry上读到了ListField, 但既然我已经完成了这段代码,也许我不需要用ListFields重写所有内容


提前谢谢

在BB论坛上回答了一个类似的问题:

我会考虑三个可行的方案:

  • 使用addAll()一次添加所有管理器 缩短布局时间
  • 使用“分页”以便只添加前15个,然后添加 如果用户也希望,请选择
  • 使用列表字段
  • 前两个选项将使您能够保留当前的管理器代码

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

    更新

    考虑到选项1对您不起作用,并且您不允许执行选项2,那么也许我可以建议选项1.5。只添加前25个左右,但添加一些滚动控件,当您接近VFM结束时检测,当您在1个屏幕内时,它会添加更多。这将导致滚动故障,在这一点上,但名单将看起来连续没有巨大的点击开始

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

    另一种方法是,在用户将焦点从编辑字段移到列表上之前,不要添加所有条目

    另一件事是,您可以在线程中异步执行此“搜索”过程,如果用户使用一些新输入更新编辑字段,则取消此过程

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

    进一步编辑


    我有一个随机的想法,也许限制VFM的高度可能会限制绘画的完成。不是真的,我已经测试过了,只画了那些可见的区域。因此,性能的影响在于布局,而不是油漆

    按如下方式更改处理搜索的代码:

    _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);
        }
    });
    
    \u editField.setChangeListener(新字段ChangeListener(){
    公共无效字段已更改(字段,int上下文){
    字符串文本=_editField.getText().toLowerCase();
    //删除垂直字段管理器
    删除(_vfmcellsplaces);
    _vfmCellPlaces.deleteAll();
    对于(int i=0;i<\u placesList.length;i++){
    TempBeanPlaces TempBeanPlaces=_placesList[i];
    if(tempBeanPlaces.getPlaceName().toLowerCase().indexOf(text)!=-1){
    _添加(tempBeanPlaces.getCellPlaceManager());
    }
    }
    //添加垂直字段管理器
    添加(_vfmcellsplaces);
    }
    });
    
    说明: 在当前显示的管理器上调用每个
    add()
    delete()
    方法时,都会导致调用更新布局。因此,如果您一个接一个地添加50名管理者,您将最终调用他们的
    sublayout()
    方法1+2+3+…+50次,即50x49/2,即1225次

    如果您一个接一个地添加600名经理,您最终会调用
    sublayout()
    179700次,这可能会让您的手机爬行


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

    @PeterStrange,我很难理解您在回答的最后一段中的评论。当您说“VFM非常高”时,您是指虚拟范围,它将高于设备屏幕尺寸吗?如果是这样,我很难想象操作系统会在任何不在可见屏幕区域的东西上运行
    paint()
    代码。如果我的假设在这里是错误的,那么黑莓的工程师们需要涂上柏油和羽毛。如果我是misr