我有一个关于ListField的问题:
如果我调用setSize(16),则指示该组件包含多少项。那么如何控制这个组件的高度呢?
例如,我使用下面的代码来显示下面的TextField和ListField,但我也想在ListField下面显示一个ButtonField:

MyScreen.java:
private MyList presetList = new MyList();
private MyScreen() {
setTitle("Favorites");
BasicFilteredList filterList = new BasicFilteredList();
String[] days = {"Monday","Tuesday","Wednesday",
"Thursday","Friday","Saturday","Sunday"};
int uniqueID = 0;
filterList.addDataSet(uniqueID,days,"days",BasicFilteredList.COMPARISON_IGNORE_CASE);
AutoCompleteField autoCompleteField = new AutoCompleteField(filterList);
add(autoCompleteField);
presetListField.setRowHeight(-2);
presetListField.setCallback(presetList);
presetListField.setSize(MyList.items.length());
add(presetListField);
}MyList.java:
public class MyList implements ListFieldCallback {
public static String items[] = {
"Favorite 01", "Favorite 02", "Favorite 03", "Favorite 04",
"Favorite 11", "Favorite 12", "Favorite 13", "Favorite 14",
"Favorite 21", "Favorite 22", "Favorite 23", "Favorite 24",
"Favorite 31", "Favorite 32", "Favorite 33", "Favorite 34"
};
public void drawListRow(ListField listField, Graphics g, int index, int y, int width) {
Font f = g.getFont();
Font b = f.derive(Font.BOLD, f.getHeight() * 2);
g.setColor(Color.WHITE);
g.drawText(items[index], Display.getWidth()/3, y);
g.drawText("Click to get frequency", Display.getWidth()/3, y + g.getFont().getHeight());
g.setFont(b);
g.setColor(Color.YELLOW);
g.drawText("100." + index, 0, y);
}
public Object get(ListField list, int index) {
return items[index];
}
public int indexOfList(ListField list, String p, int s) {
return -1;
}
public int getPreferredWidth(ListField list) {
return Display.getWidth();
}
}谢谢!亚历克斯
更新:
也许ListField应该总是显示它的所有项,而不能将它的视图限制为几行?
发布于 2011-04-05 14:57:55
这可能不是您所要求的,但您能否尝试将按钮放入屏幕的状态容器中?这将是将按钮放在屏幕底部的最简单的方法。但是,在这种情况下,无论列表大小(项目数),按钮都将保留在那里。
类MainScreen 公开无效setStatus(现场状态) 设置此屏幕状态部分的内容。此方法将您提供的字段添加到此屏幕的状态部分,即使它已经包含了一个字段。参数:状态-新状态字段。
更新:
你是在问为什么这是事实。在我看来,这是RIM实现某种MVC ()模式的尝试。毫无疑问,这并不理想。ListField是一个老的核心BB类,多年来一直没有改变。我认为如果他们有第二次机会,API会好得多。例如,在Android列表中,API要好得多。我也觉得ListField.setSize()有点难看,但是我们不能改变这一点,这取决于我们手动指示ListField底层列表已经改变了它的大小。
关于ListFieldCallback使用的一点。使用这种方法,ListField本身不知道列表项实际上是什么。应该由ListFieldCallback根据请求返回列表项对象,或者根据请求绘制列表项表示。注意,这是在请求时发生的。ListField要求ListFieldCallback只绘制屏幕上可见的项目。这在速度和内存使用方面是非常重要的。如果您的列表是1000个项,并且每个项都意味着绘制一个应该从网络加载的图标(或者只是从文件系统中读取),那么立即准备完整的列表数据,这应该是一个显示停止。但是使用ListFieldCallback,您只能处理那些被请求的项,这样您就可以实现延迟加载,并且您的列表变得尽可能快。
对于一些简单的情况(当您的listItem UI表示可以通过调用listItem.toString()获得时),就会有ObjectListField类。这个类已经实现了ListFieldCallback,因此它会立即显示列表。
https://stackoverflow.com/questions/5553000
复制相似问题