我正在使用ListFields。我需要自定义ListField。我有这张照片( http://supportforums.blackberry.com/t5/Java-Development/custom-list-field/td-p/2618419):
我获得了CodeModuleManager
已安装应用的列表,现在我想在ListField中显示,如上图所示。你可以看到黑色的锁定图片,我需要在点击时自定义该图片。
我的意思是,当我点击任何行时,我想从列表字段中的单击行中删除黑色的锁定图片,当我再次点击同一行时,我想将该锁定图片插回该行。
我想我必须在点击或其他内容中调用drawListRow()
方法?当我点击列表时,黑色锁定图像应该消失。当我再次点击列表时,它应该再次出现。
这是我使用的屏幕代码:
public final class MyScreen extends MainScreen {
CustomListField myListView;
public MyScreen() {
Bitmap listThumb = Bitmap.getBitmapResource("icon.png");
String listTitle="Headline";
String listDesc = "Mobile news feeds";
String listDesc2 = " ";
final Bitmap navBar = Bitmap.getBitmapResource("lock.png");
Vector v = new Vector();
for(int i=0; i<30; i++){
v.addElement(new ListRander(listThumb, listTitle, listDesc,listDesc2, navBar));
}
//v.addElement(new ListRander(listThumb, listTitle, listDesc,listDesc2, navBar));
myListView = new CustomListField(v){
protected boolean trackwheelClick (int status, int time) {
Dialog.alert(" You have selected :" + getSelectedIndex());
return super.trackwheelClick(status, time);
}
}
;
add(myListView);
}
}
行数据类:
package mypackage;
import net.rim.device.api.system.Bitmap;
public class ListRander {
private Bitmap listThumb= null;
private Bitmap navBar = null;
private String listTitle=null;
private String listDesc= null;
private String listDesc2= null;
public ListRander(Bitmap listThumb,String listTitle, String listDesc, String listDesc2, Bitmap navBar) {
this.listDesc = listDesc;
this.listDesc2 = listDesc2;
this.listThumb = listThumb;
this.listTitle = listTitle;
this.navBar = navBar;
}
public Bitmap getListThumb() {
return listThumb;
}
public void setListThumb(Bitmap listThumb) {
this.listThumb = listThumb;
}
public Bitmap getNavBar() {
return navBar;
}
public void setNavBar(Bitmap navBar) {
this.navBar = navBar;
}
public String getListTitle() {
return listTitle;
}
public void setListTitle(String listTitle) {
this.listTitle = listTitle;
}
public String getListDesc() {
return listDesc;
}
public void setListDesc(String listDesc) {
this.listDesc = listDesc;
}
public String getListDesc2() {
return listDesc2;
}
public void setListDesc2(String listDesc2) {
this.listDesc2 = listDesc2;
}
}
自定义列表字段:
package mypackage;
import java.util.Enumeration;
import java.util.Vector;
import net.rim.device.api.system.Bitmap;
import net.rim.device.api.ui.Color;
import net.rim.device.api.ui.Font;
import net.rim.device.api.ui.Graphics;
import net.rim.device.api.ui.XYRect;
import net.rim.device.api.ui.component.ListField;
import net.rim.device.api.ui.component.ListFieldCallback;
public class CustomListField extends ListField implements ListFieldCallback {
private Vector _listData;
private int _MAX_ROW_HEIGHT = 60;
public CustomListField (Vector data) {
_listData = data;
setSize(_listData.size());
setSearchable(true);
setCallback(this);
setRowHeight(_MAX_ROW_HEIGHT);
}
protected void drawFocus (Graphics graphics, boolean on) {
XYRect rect = new XYRect();
graphics.setGlobalAlpha(150);
graphics.setColor(Color.BLUE);
getFocusRect(rect);
drawHighlightRegion(graphics,HIGHLIGHT_FOCUS,true,rect.x,rect.y,rect.width,rect.height);
}
public int moveFocus (int amount, int status, int time) {
this.invalidate(this.getSelectedIndex());
return super.moveFocus(amount, status, time);
}
public void onFocus (int direction) {
super.onFocus(direction);
}
protected void onUnFocus () {
this.invalidate(this.getSelectedIndex());
}
public void refresh () {
this.getManager().invalidate();
}
public void drawListRow (ListField listField, Graphics graphics, int index, int y, int w) {
ListRander listRander = (ListRander)_listData.elementAt(index);
graphics.setGlobalAlpha(255);
graphics.setFont(Font.getDefault().getFontFamily().getFont(Font.PLAIN, 24));
final int margin =5;
final Bitmap thumb= listRander.getListThumb();
final String listHeading = listRander.getListTitle();
final String listDesc= listRander.getListDesc();
final String listDesc2= listRander.getListDesc2();
final Bitmap nevBar = listRander.getNavBar();
//list border
graphics.setColor(Color.BLACK);
graphics.drawRect(0, y, w, _MAX_ROW_HEIGHT);
//thumbnail border & thumbnail image
graphics.setColor(Color.BLACK);
graphics.drawRoundRect(margin-2, y+margin-2,thumb.getWidth()+2, thumb.getHeight()+2, 5, 5);
graphics.drawBitmap(margin, y+margin, thumb.getWidth(), thumb.getHeight(), thumb, 0, 0);
//drawing texts
// graphics.setFont(FontGroup.fontBold);
graphics.drawText(listHeading, 2*margin+thumb.getWidth(), y+margin);
graphics.setColor(Color.BLACK);
// graphics.setFont(FontGroup.smallFont);
graphics.drawText(listDesc, 2*margin+thumb.getWidth(), y+ margin+20);
graphics.drawText(listDesc2, 2*margin+thumb.getWidth(), y+ margin+32);
//draw navigation button
final int navBarPosY = y+(_MAX_ROW_HEIGHT/2 - nevBar.getHeight()/2);
final int navBarPosX = Graphics.getScreenWidth()- nevBar.getWidth()+ margin;
graphics.drawBitmap(navBarPosX-10, navBarPosY, nevBar.getWidth(), nevBar.getHeight(), nevBar, 0 , 0);
}
public Object get(ListField listField, int index) {
String rowString = (String) _listData.elementAt(index);
return rowString;
}
public int indexOfList (ListField listField, String prefix, int start) {
for (Enumeration e = _listData.elements(); e.hasMoreElements(); ) {
String rowString = (String) e.nextElement();
if (rowString.startsWith(prefix)) {
return _listData.indexOf(rowString);
}
}
return 0;
}
public int getPreferredWidth(ListField listField) {
return 3 * listField.getRowHeight();
}
}
答案 0 :(得分:0)
关注您的代码有点困难,因为您的变量未正确命名(例如navBar
使用的lock.png)。请在将来尝试清理一下......你将能够以这种方式获得更好的答案。
从您的代码中,我可以看到使用以下代码在drawListRow()
中绘制锁定图像:
final int navBarPosY = y+(_MAX_ROW_HEIGHT/2 - nevBar.getHeight()/2);
final int navBarPosX = Graphics.getScreenWidth()- nevBar.getWidth()+ margin;
graphics.drawBitmap(navBarPosX-10, navBarPosY, nevBar.getWidth(), nevBar.getHeight(), nevBar, 0 , 0);
因此,您只需要跟踪drawListRow()
可以检查以确定是否应该绘制锁定的每一行的布尔值。将新的锁定的属性添加到ListRander
,代表一行:
public class ListRander {
private boolean locked = true; // defaults to "locked"
public boolean isLocked() {
return locked;
}
public void setLocked(boolean value) {
locked = value;
}
然后,您可以将您的点击处理程序代码更改为:
myListView = new CustomListField(v){
protected boolean navigationClick(int status, int time) {
int index = getSelectedIndex();
ListRander lr = (ListRander) get(this, index);
lr.setLocked(!lr.isLocked());
// force a repaint of this row
invalidate(index);
return true; // event consumed
}
//protected boolean trackwheelClick (int status, int time) {
// keep this commented out, unless trackwheel devices need special logic
//}
};
这需要更改CustomListField#get(ListField, int)
方法,这通常会返回一行的完整数据对象:
public Object get(ListField listField, int index) {
return _listData.elementAt(index);
}
最后,更改drawListRow()
以使用此新布尔值:
if (listRander.isLocked()) {
// draw lock button
final int navBarPosY = y+(_MAX_ROW_HEIGHT/2 - nevBar.getHeight()/2);
final int navBarPosX = Display.getWidth() - nevBar.getWidth()+ margin;
graphics.drawBitmap(navBarPosX-10, navBarPosY, nevBar.getWidth(), nevBar.getHeight(), nevBar, 0 , 0);
}