如何在 BlackBerry 中自定义 ListField?
Posted
技术标签:
【中文标题】如何在 BlackBerry 中自定义 ListField?【英文标题】:How to customize a ListField in BlackBerry? 【发布时间】:2010-12-24 17:40:24 【问题描述】:我想在 BlackBerry 中自定义一个 ListField,它可以连续列出图像和文本。
如何做到这一点?
【问题讨论】:
【参考方案1】:试试这样的:
class TaskListField extends ListField implements ListFieldCallback
private Vector rows;
private Bitmap p1;
private Bitmap p2;
private Bitmap p3;
public TaskListField()
super(0, ListField.MULTI_SELECT);
setRowHeight(80);
setEmptyString("Hooray, no tasks here!", DrawStyle.HCENTER);
setCallback(this);
p1 = Bitmap.getBitmapResource("1.png");
p2 = Bitmap.getBitmapResource("2.png");
p3 = Bitmap.getBitmapResource("3.png");
rows = new Vector();
for (int x = 0; x < 10; x++)
TableRowManager row = new TableRowManager();
// SET THE PRIORITY BITMAP FIELD
// if high priority, display p1 bitmap
if (x % 2 == 0)
row.add(new BitmapField(p1));
// if priority is 2, set p2 bitmap
else if (x % 3 == 0)
row.add(new BitmapField(p2));
// if priority is 3, set p3 bitmap
else
row.add(new BitmapField(p3));
// SET THE TASK NAME LABELFIELD
// if overdue, bold/underline
LabelField task = new LabelField("Task #" + String.valueOf(x),
DrawStyle.ELLIPSIS);
// if due today, bold
if (x % 2 == 0)
task.setFont(Font.getDefault().derive(
Font.BOLD | Font.UNDERLINED));
System.out.println("OVERDUE");
else
task.setFont(Font.getDefault().derive(Font.BOLD));
System.out.println("TODAY");
row.add(task);
// SET THE LIST NAME
row.add(new LabelField("List Name #" + String.valueOf(x),
DrawStyle.ELLIPSIS)
protected void paint(Graphics graphics)
graphics.setColor(0x00878787);
super.paint(graphics);
);
// SET THE DUE DATE/TIME
row.add(new LabelField("Due Date #" + String.valueOf(x),
DrawStyle.ELLIPSIS | LabelField.USE_ALL_WIDTH
| DrawStyle.RIGHT)
protected void paint(Graphics graphics)
graphics.setColor(0x00878787);
super.paint(graphics);
);
rows.addElement(row);
setSize(rows.size());
// ListFieldCallback Implementation
public void drawListRow(ListField listField, Graphics g, int index, int y,
int width)
TaskListField list = (TaskListField) listField;
TableRowManager rowManager = (TableRowManager) list.rows
.elementAt(index);
rowManager.drawRow(g, 0, y, width, list.getRowHeight());
private class TableRowManager extends Manager
public TableRowManager()
super(0);
// Causes the fields within this row manager to be layed out then
// painted.
public void drawRow(Graphics g, int x, int y, int width, int height)
// Arrange the cell fields within this row manager.
layout(width, height);
// Place this row manager within its enclosing list.
setPosition(x, y);
// Apply a translating/clipping transformation to the graphics
// context so that this row paints in the right area.
g.pushRegion(getExtent());
// Paint this manager's controlled fields.
subpaint(g);
g.setColor(0x00CACACA);
g.drawLine(0, 0, getPreferredWidth(), 0);
// Restore the graphics context.
g.popContext();
// Arrages this manager's controlled fields from left to right within
// the enclosing table's columns.
protected void sublayout(int width, int height)
// set the size and position of each field.
int fontHeight = Font.getDefault().getHeight();
int preferredWidth = getPreferredWidth();
// start with the Bitmap Field of the priority icon
Field field = getField(0);
layoutChild(field, 32, 32);
setPositionChild(field, 0, 0);
// set the task name label field
field = getField(1);
layoutChild(field, preferredWidth - 16, fontHeight + 1);
setPositionChild(field, 34, 3);
// set the list name label field
field = getField(2);
layoutChild(field, 150, fontHeight + 1);
setPositionChild(field, 34, fontHeight + 6);
// set the due time name label field
field = getField(3);
layoutChild(field, 150, fontHeight + 1);
setPositionChild(field, preferredWidth - 152, fontHeight + 6);
setExtent(preferredWidth, getPreferredHeight());
// The preferred width of a row is defined by the list renderer.
public int getPreferredWidth()
return Graphics.getScreenWidth();
// The preferred height of a row is the "row height" as defined in the
// enclosing list.
public int getPreferredHeight()
return getRowHeight();
public Object get(ListField listField, int index)
return null;
public int getPreferredWidth(ListField listField)
return 0;
public int indexOfList(ListField listField, String prefix, int start)
return 0;
见rtm4bb - A BlackBerry Client for Remember the Milk的代码:
【讨论】:
我真的很喜欢这个答案,它不再在 drawListRow 中做各种 gobbledygook,实际上允许您向列表字段添加适当的字段来处理他们自己的绘图问题。 +1 是的,这是一个不错的技巧。但是,如果列表很长,则会创建太多未用于其自然目的的对象。这就是 API 提供ListField
的原因 - 以节省长列表中的资源。我宁愿正确实施ListFieldCallback.drawListRow()
。【参考方案2】:
如果不了解您正在尝试做什么的更多细节,我建议您看一下 BlackBerry 开发环境附带的一些示例应用程序。 Contacts.java 和 PhoneApiDemo.java 等一些应用程序具有 ListField
和 ListFieldCallback
实现。
【讨论】:
【参考方案3】:从 BlackBerry Java SDK 6.0 开始,您可以使用 RichList
:
使用丰富列表显示包含可选内容的项目列表 左侧的图像,图像旁边的标签列表和可选的 图片和标签下方的描述
RichList list = new RichList(mainManager, true, 2, 1);
list.add(new Object[] bitmap1, "Device 1",
"BlackBerry Smartphone 9500",
"Description of Device 1.");
list.add(new Object[] bitmap2, "Device 2",
"BlackBerry Smartphome 9000",
"Description of Device 2.");
【讨论】:
我不会对你投反对票,但我认为因为你的回答与问题无关,RichList
不是ListField
的可自定义实现以上是关于如何在 BlackBerry 中自定义 ListField?的主要内容,如果未能解决你的问题,请参考以下文章