在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内特:非常感谢内特。我明白了重点,我使用了你的代码。它运行良好,解决了我的问题。非常感谢。。。