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论坛上回答了一个类似的问题: 我会考虑三个可行的方案:
我有一个随机的想法,也许限制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