blackberry中的列表字段,事件单击侦听器不工作

blackberry中的列表字段,事件单击侦听器不工作,blackberry,blackberry-eclipse-plugin,blackberry-jde,Blackberry,Blackberry Eclipse Plugin,Blackberry Jde,我正在BBOSV5.0上工作。我已设法使列表显示在屏幕上。我正在从webservice获取数据,并将其添加到向量中 现在我想找出onclick,它是被单击的项目,并相应地执行一些操作。为此,我试图显示一个警报。但我没有得到警告 这是我的密码: 在我的主屏幕中,我添加了fieldmanager=new VerticalFieldManager()和添加(fieldmanager) void fetchAlbumsForLetter(字符串字母){ 状态显示(“处理…”,3000); fieldM

我正在BBOSV5.0上工作。我已设法使列表显示在屏幕上。我正在从webservice获取数据,并将其添加到
向量中

现在我想找出onclick,它是被单击的项目,并相应地执行一些操作。为此,我试图显示一个警报。但我没有得到警告

这是我的密码:

在我的主屏幕中,我添加了
fieldmanager=new VerticalFieldManager()
添加(fieldmanager)

void fetchAlbumsForLetter(字符串字母){
状态显示(“处理…”,3000);
fieldManager.deleteAll();
VerticalFieldManager top=新的VerticalFieldManager(Manager.NO_HORIZONTAL_SCROLL | Manager.NO_HORIZONTAL_SCROLLBAR | Manager.VERTICAL_SCROLLBAR | Manager.VerticalFieldManager.VERTICAL_SCROLLBAR |字段。使用_ALL_WIDTH){
公共空间绘制(图形){
图形.背景色(0x00290008);
图形.设置颜色(颜色.白色);
graphics.clear();
graphics.drawBitmap(0,0,sha.getWidth(),
sha.getHeight(),sha,0,0);
超级油漆(图形);
}
};
添加(顶部);
CustomListField4 list4=新CustomListField4(空){
受保护的布尔导航单击(int状态,int时间){
getValue4();
返回true;
}
};
fieldmanager.add(列表4);
}
受保护的void getValue4(){
字段f=getFieldWithFocus();
if(f instanceof ListField){
ListField l=(ListField)f;
最终整数索引=l.getSelectedIndex();
HistoryItem\u contactslist=(HistoryItem)CustomListField4.val4.elementAt(索引);
最终字符串id=_contactslist.getName();
对话框。警报(id+“”);
}
}
请帮我解决这个问题

编辑

类CustomListField4扩展ListField实现ListFieldCallback{
公共CustomListField4(矢量数据){
超级(0,列表字段。多选择);
最终TableRowManager行=新建TableRowManager(){
公共空间涂料(图g){
//g.fillRect(0,0,getWidth(),getHeight());
g、 设置颜色(0x0f3e19b);
g、 清除();
超级油漆(g);
}
};
位图图标=Bitmap.getBitmapResource(“Devil Skype.png”);
HorizontalFieldManager h=新的HorizontalFieldManager();
h、 添加(新位图字段(图标));
//h、 添加(新位图字段(song.getThumb());
h、 添加(新LabelField(song.getAlbumName());
//h、 添加(新LabelField(row1.getLanguage());
//h、 设定裕度(0,0,50,0);
//Dialog.alert(song.getName());
VerticalFieldManager vfm=新的VerticalFieldManager();
vfm.add(h);
//add(新LabelField(song.getArtist());
行。添加(vfm);
触点。附加元件(世界其他地区);
}
设置大小(contacts.size());
}
//ListFieldCallback实现
public void drawListRow(ListField ListField、图形g、整数索引、整数y、整数宽度){
listField.setRowHeight(索引,107);
CustomListField4列表=(CustomListField4)listField;
TableRowManager rowManager=(TableRowManager)CustomListField4.contacts.elementAt(索引);
rowManager.drawRow(g,0,y,width,list.getRowHeight());
}
公共类TableRowManager扩展管理器{
公共表行管理器(){
超级(0);
}   
您可以试试这个

 UiApplication.getUiApplication().invokeLater(new Runnable() {
                public void run() {
                    Dialog.alert(id+"");
                }
            });

我认为您的
字段
管理器
对象的层次结构不正确,这会导致您在检测字段焦点/选择时出现问题

从您发布的原始代码中看不出这一点,但通过查看您的更新,我假设您每行调用一次
fetchAlbumsForLetter()
,这是不对的

fetchAlbumsForLetter()
每次调用时都会创建一个新的
CustomListField4
。而且,
CustomListField4
是一个
ListField

ListField
并不意味着只表示一行。它意味着表示所有行。您应该只创建一个
CustomListField4
的实例

我会做两件事中的一件:

1.继续使用列表字段 如果希望
CustomListField4
成为
ListField
扩展ListField
),则在

public void drawListRow(ListField ListField,Graphics g,int index,int y,int width);
实际上,您应该使用所有的
graphics#draw
方法绘制图形对象。这些是基本的图形项,如填充区域、线条、文本或位图。您可以使用
TableRowManager

,或

2.与经理一起模仿ListField 将代码更改为

公共类CustomListField4扩展了VerticalFieldManager{

公共类CustomListField4扩展管理器{
然后,您可以对每一行使用
TableRowManager
,并向其中添加
LabelField
BitmapField
对象



如果您解决了这些问题,那么我认为覆盖
导航单击()
的方法可以很好地检测行单击,并对所选行执行操作。

您正在调用getFieldWithFocus(),它将为您提供管理器。您需要获取叶字段

protected void getValue4() {
   Field f = getLeafFieldWithFocus();
   if (f instanceof ListField) {
       //Your code
   }
}

getValue4()
已经在UI线程上运行,因此我不认为这会解决问题,不幸的是。啊,你是对的。因为我在无法显示对话框时使用了这种方法,请发布你的
CustomListField4
类中的一些代码。我们不知道这是什么。我看不出上面的任何错误,除非是某些错误正在
CustomListField4
,或者在联系人列表中查找
index
。@Signar