User interface 如何在BlackBerry中自定义列表字段?

User interface 如何在BlackBerry中自定义列表字段?,user-interface,blackberry,custom-controls,listfield,User Interface,Blackberry,Custom Controls,Listfield,我想在BlackBerry中自定义一个ListField,它可以在一行中列出图像和文本 如何做到这一点?在不了解您尝试做什么的更多细节的情况下,我建议您看看BlackBerry开发环境附带的一些示例应用程序。一些应用程序,如Contacts.java和PhoneApiDemo.java有一个ListField和ListFieldCallback实现。请尝试以下方法: class TaskListField扩展ListField实现ListFieldCallback{ 专用向量行; 私有位图p1;

我想在BlackBerry中自定义一个ListField,它可以在一行中列出图像和文本


如何做到这一点?

在不了解您尝试做什么的更多细节的情况下,我建议您看看BlackBerry开发环境附带的一些示例应用程序。一些应用程序,如Contacts.javaPhoneApiDemo.java有一个
ListField
ListFieldCallback
实现。请尝试以下方法:

class TaskListField扩展ListField实现ListFieldCallback{
专用向量行;
私有位图p1;
私有位图p2;
私有位图p3;
公共任务列表字段(){
超级(0,列表字段。多选择);
设置行高(80);
setEmptyString(“万岁,这里没有任务!”,DrawStyle.HCENTER);
setCallback(这个);
p1=Bitmap.getBitmapResource(“1.png”);
p2=Bitmap.getBitmapResource(“2.png”);
p3=Bitmap.getBitmapResource(“3.png”);
行=新向量();
对于(int x=0;x<10;x++){
TableRowManager行=新建TableRowManager();
//设置优先级位图字段
//如果优先级较高,则显示p1位图
如果(x%2==0){
添加(新位图字段(p1));
}
//如果优先级为2,则设置p2位图
如果(x%3==0),则为else{
添加(新位图字段(p2));
}
//如果优先级为3,则设置p3位图
否则{
行添加(新位图字段(p3));
}
//设置任务名称LABELFIELD
//如果过期,请使用粗体/下划线
LabelField task=新LabelField(“task#”+String.valueOf(x),
略号);
//如果今天到期,请加粗
如果(x%2==0){
task.setFont(Font.getDefault().derivate(
Font.BOLD | Font.下划线);
系统输出打印项次(“过期”);
}否则{
task.setFont(Font.getDefault().derivate(Font.BOLD));
System.out.println(“今天”);
}
行。添加(任务);
//设置列表名
行。添加(新LabelField(“列表名”#“+String.valueOf(x),
DrawStyle.省略号){
受保护的空心漆(图形){
graphics.setColor(0x00878787);
超级油漆(图形);
}
});
//设置到期日期/时间
行。添加(新LabelField(“到期日”#“+String.valueOf(x),
DrawStyle.省略号| LabelField.USE_ALL_WIDTH
|DrawStyle(右){
受保护的空心漆(图形){
graphics.setColor(0x00878787);
超级油漆(图形);
}
});
行。添加元素(行);
}
设置大小(rows.size());
}
//ListFieldCallback实现
public void drawListRow(ListField ListField,图形g,整数索引,整数y,
整数宽度){
TaskListField list=(TaskListField)listField;
TableRowManager rowManager=(TableRowManager)list.rows
.elementAt(索引);
rowManager.drawRow(g,0,y,width,list.getRowHeight());
}
私有类TableRowManager扩展管理器{
公共表行管理器(){
超级(0);
}
//使该行管理器中的字段进行布局
//画的。
公共空白绘图行(图形g、整数x、整数y、整数宽度、整数高度){
//在此行管理器中排列单元格字段。
布局(宽度、高度);
//将此行管理器放置在其封闭列表中。
设定位置(x,y);
//对图形应用平移/剪裁变换
//上下文,以便此行在正确的区域中绘制。
g、 pushRegion(getExtent());
//绘制此管理器的控制字段。
子漆(g);
g、 setColor(0x00CACACA);
g、 绘图线(0,0,getPreferredWidth(),0);
//恢复图形上下文。
g、 popContext();
}
//在内部从左到右排列此管理器的受控字段
//封闭表的列。
受保护的空位子布局(整数宽度、整数高度){
//设置每个字段的大小和位置。
int fontHeight=Font.getDefault().getHeight();
int preferredWidth=getPreferredWidth();
//从优先级图标的位图字段开始
字段=getField(0);
layoutChild(字段,32,32);
setPositionChild(字段,0,0);
//设置任务名称标签字段
field=getField(1);
layoutChild(字段,首选宽度-16,字体高度+1);
setPositionChild(字段,34,3);
//设置列表名称标签字段
field=getField(2);
layoutChild(字段150,字体高度+1);
setPositionChild(字段,34,字体高度+6);
//设置到期时间名称标签字段
field=getField(3);
layoutChild(字段150,字体高度+1);
setPositionChild(字段,首选宽度-152,字体高度+6);
setExtent(preferredWidth,getPreferredHeight());
}
//行的首选宽度由列表渲染器定义。
public int getPreferredWidth(){
返回Graphics.getScreenWidth();
}
//行的首选高度是中定义的“行高度”
//随附清单。
public int getPreferredHeight(){
返回getRowHeight();
}
}
公共对象get(ListField ListField,int index){
返回null;
}
public int getPreferredWidth(ListField ListField){
返回0;
}
public int indexOfList(ListField ListField,字符串前缀,int start){
返回0;
}
}

请参阅以下代码:

从BlackBerry Java SDK 6.0开始,您可以使用:

使用富列表显示包含可选项的项目列表 左侧的图像、图像旁边的标签列表和可选的 图片和标签下方的说明


我真的很喜欢这个答案,它避免了在drawListRow中执行各种各样的gobbledygook,实际上允许您向listfield添加适当的字段,以处理它们自己的绘图问题。+1是的,这是一个很好的技巧。但是,如果列表很长,则会有太多创建的对象未用于其自然用途。这就是为什么API提供了
ListField
——以节省长列表上的资源。我宁愿正确地实现
ListFieldCallback.drawListRow()
。我不会对你投反对票,但我认为因为你的答案与问题无关,
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."});