在Blackberry中绘制有限的ListField项,而不是完整的列表
在Blackberry中绘制有限的ListField项,而不是完整的列表,blackberry,blackberry-jde,Blackberry,Blackberry Jde,我正在尝试绘制设备中保存的所有联系人的列表。一切正常,但当我选择所有联系人时,我只得到屏幕上绘制的联系人。换句话说,只列出屏幕上可见的联系人。要获得剩余的联系人,我必须滚动列表
这是我的密码:
公共类CheckboxListField扩展VerticalFieldManager实现ListFieldCallback、FieldChangeListener{
专用静态向量选择联系人;
私有ChecklistData[]mListData=新ChecklistData[]{};
私有ListFiel
我正在尝试绘制设备中保存的所有联系人的列表。一切正常,但当我选择所有联系人时,我只得到屏幕上绘制的联系人。换句话说,只列出屏幕上可见的联系人。要获得剩余的联系人,我必须滚动列表
这是我的密码:
公共类CheckboxListField扩展VerticalFieldManager实现ListFieldCallback、FieldChangeListener{
专用静态向量选择联系人;
私有ChecklistData[]mListData=新ChecklistData[]{};
私有ListField-mListField;
私有静态向量mContacts;
私人通讯录;
私人接触;
私人发送电子邮件;
私有布尔值isChecked=false;
私人黑莓联系人项目;
私人VerticalFieldManager _mainVFM=新的VerticalFieldManager;
私人互联网i;
私有int j=0;
私人字符串电子邮件=;
专用按钮字段(U)按钮;;
私人HorizontalFieldManager选择AllHFM;
私有自定义按钮字段selectAllButton;
私有位图_uncheckBmp;
私有位图_checkBmp;
专用标签字段selectAllLabel;
private CheckboxField selectAllCheckBox;
私人VerticalFieldManager contactListVFM;
私有布尔listItemChecked=false;
私有字符串缓冲行字符串;
私有布尔getCBoxStatus;
//用于保存复选框中的字符串及其复选框状态的类
//检查或不检查。
私有类ChecklistData{
私有字符串_stringVal;
私有布尔值被选中;
私有字符串_telNumber;
ChecklistDataString stringVal,布尔值已选中{
_stringVal=stringVal;
_已检查=已检查;
//_电话号码=电话号码;
}
//获取/设置方法。
私有字符串getStringVal{
返回_stringVal;
}
检查私有布尔值{
返回已检查;
}
//切换选中状态。
公共无效切换已选中{
_选中=!\u选中;
}
}
公共CheckboxListField{
_mainVFM.addCreateContactList已选中;
添加_mainVFM;
}
public VerticalFieldManager createContactListboolean已选中{
isChecked=已检查;
selectedContacts=新向量;
//邀请按钮
contactListVFM=新的VerticalFieldManager;
_inviteButton=新建按钮FieldInvite Friend;
_inviteButton.setChangeListenerthis;
_inviteButton.setMargin2,0,10,0;
//选中所有复选框
选择AllHFM=new HorizontalFieldManager;
_uncheckBmp=Bitmap.getBitmapResourceUncheck.png;
_checkBmp=Bitmap.getBitmapResourcechecked.png;
选择AllButton=new CustomButtonField29、\u uncheckBmp、\u checkBmp、ButtonField.consumer\u单击;
选择AllButton.setChangeListenerthis;
选择AllButton.setMargin5,5,5;
selectAllCheckBox=new Checkbox Field全选,已选中{
受保护的布尔导航ClickInt状态,
整数时间{
selectedContacts=新向量;
电子邮件=;
布尔getCBoxStatus=selectAllCheckBox.getChecked;
iflistItemChecked==false{
如果_mainVFM.getFieldCount!=0{
_mainVFM.deleteAll;
_mainVFM.addcreateContactListgetCBoxStatus;
}
}
返回true;
}
};
选择AllCheckbox.setChangeListenerthis;
选择AllLabel=new LabelFields全选;
选择AllLabel.setMargin5,5,5;
选择AllHFM.addselectAllCheckBox;
//选择AllHFM.addselectAllLabel;
//在导航上切换列表字段项单击
mListField=新列表字段{
受保护的布尔导航ClickInt状态,
整数时间{
切换项;
返回true;
};
};
//设置两行行高度
//mListField.setRowHeightgetFont.getHeight*2;
mListField.setCallbackthis;
//contactListVFM.addnew NullFieldNullField.FOCUSABLE;
contactListVFM.add\u按钮;
contactListVFM.addselectAllHFM;
contactListVFM.addnew分离器字段;
contactListVFM.addmListField;
//负载触点
//在单独的螺纹中加载触点
loadContacts.run;
返回联系人列表vfm;
}
受保护的可运行loadContacts=新可运行{
公开募捐{
重新加载联系人列表;
//UI事件线程中的填充列表字段控件
UiApplication.getUiApplication.invokeLater
填充列表;
}
};
受保护的可运行填充列表=新可运行{
公开募捐{
int size=mContacts.size;
mListData=新的ChecklistData[大小];
对于int i=0;i>>>>>>+mListData[i];
}
mListField.setSizesize;
//使无效;
}
};
受保护的无效切换项{
listItemChecked=true;
选择AllCheckbox.setCheckedfalse;
listItemChecked=false;
//获取所选行的索引。
int index=mListField.getSelectedIndex;
System.out.println………+索引;
如果索引!=-1{
//获取此行的ChecklistData。
ChecklistData=mListData[index];
//切换其状态。
data.toggleChecked;
mListField.invalidateindex;
}
}
私有布尔重载联系人列表{
试一试{
contactList=联系人列表PIM
.getInstance
.openPIMListPIM.CONTACT_列表,
PIM.READ_ONLY;
allContacts=contactList.items;
mContacts=enumToVectorallContacts;
mListField.setSizemContacts.size;
System.out.println;
返回true;
}捕捉皮姆{
返回false;
}
}
//将联系人列表从枚举转换为向量
私有向量enumToVectorEnumeration联系人Enum{
向量v=新向量;
如果contactEnum==null
返回v;
而contactEnum.hasMoreElements{
Contact Contact=联系所有联系人。nextElement;
如果ContactList.IsupportedFieldContact.EMAIL&&contact.countValuesContact.EMAIL>0{
字符串emailID=contact.getStringContact.EMAIL,0;
ifemailID.length!=0&&emailID!=null{
v、 附加接触;
}
}
}
返回v;
}
公共作废drawListRowListField列表,
图形,整数索引,整数y,整数w{
rowString=新的StringBuffer;
Object obj=this.getlist,索引;
如果list.getSelectedIndex!=索引{
graphics.setBackgroundColorindex%2==0 | | index==0?Color.WHITE
:颜色。浅灰色;
图形清晰;
//list.setFocus;
}
BlackBerryContact触点=BlackBerryContact mContacts
.elementAtindex;
字符串email=contact.getStringContact.email,0;
int vecIndex=selectedContacts.indexOfemail;
如果obj!=null{
ChecklistData currentRow=ChecklistData obj;
如果选中currentRow{
ifvecIndex==-1{
selectedContacts.addElementemail;
}
行列
.appendCharacters.BALLOT\u框\u,带\u复选框;
}否则{
selectedContacts.removeElementemail;
rowString.appendCharacters.ball_框;
}
//附加两个空格和行的文本。
rowString.appendCharacters.SPACE;
rowString.appendCharacters.SPACE;
rowString.appendcurrentRow.getStringVal;
//画课文。
}
graphics.drawTextrowString.toString,0,y,
0,w;
}
公共静态字符串getDisplayNameContact联系人{
如果contact==null{
返回null;
}
字符串displayName=null;
//首先,查看是否为联系人设置了有意义的名称。
如果contact.countvaluescocontact.NAME>0{
最终字符串[]名称=contact.getStringArray
联系人名称,0;
最后一个字符串firstName=name[联系人姓名];
最后一个字符串lastName=name[Contact.name_FAMILY];
如果firstName!=null&&lastName!=null{
displayName=firstName++lastName;
}如果firstName!=null,则为else{
displayName=firstName;
}如果lastName!=null,则为else{
displayName=lastName;
}
如果displayName!=null{
最终字符串namePrefix=姓名[联系人姓名前缀];
如果namePrefix!=null{
displayName=namePrefix+
+显示名称;
}
返回显示名;
}
}
返回显示名;
}
//返回指定索引处的对象。
公共对象getListField列表,int索引{
对象结果=空;
如果mListData.length>索引{
R
esult=mListData[索引];
}
System.out.println,,,,,,,,,,,,,,,,,,,,,+mListData.length;
返回结果;
}
//返回给定字符串的第一个匹配项,
//在索引处开始搜索,并测试
//使用equals方法实现相等。
public int indexoflistfield列表,字符串p,int s{
返回-1;
}
//返回屏幕宽度,以便列表使用整个屏幕宽度。
public int getPreferredWidthListField列表{
返回Graphics.getScreenWidth;
//返回Display.getWidth;
}
public void字段changedfield字段,int上下文{
iffield==\u按钮{
forint n=0;n这与类似。问题在于,回调旨在让您绘制需要绘制的行。它不意味着做任何其他事情,比如将联系人列表组合到电子邮件中
BlackBerry操作系统试图提高效率,因此它只会要求您为用户在屏幕上实际可见的行绘制列表行。其他任何操作都将是浪费
因此,如果您想组合所有选定行的列表,您应该在其他地方进行,而不是在drawListRow中
在我看来,您可以使用以下代码构建当前所有选定行的列表,无论您在何处:
公共向量getSelectedContacts{
选择Contacts.removeAllElements;
对于int i=0;i内特:非常感谢内特。我明白了重点,我使用了你的代码。它运行良好,解决了我的问题。非常感谢。。。