2009-12-09 11 views

Antwort

52

screenshot http://img10.imageshack.us/img10/1410/listfield.jpg
so etwas wie dieses Versuchen:

class TaskListField extends ListField implements ListFieldCallback { 
private Vector rows; 
private Bitmap p1; 
private Bitmap p2; 
private Bitmap p3; 

public TaskListField() { 
    super(0, ListField.MULTI_SELECT); 
    setRowHeight(80); 
    setEmptyString("Hooray, no tasks here!", DrawStyle.HCENTER); 
    setCallback(this); 

    p1 = Bitmap.getBitmapResource("1.png"); 
    p2 = Bitmap.getBitmapResource("2.png"); 
    p3 = Bitmap.getBitmapResource("3.png"); 

    rows = new Vector(); 

    for (int x = 0; x < 10; x++) { 
    TableRowManager row = new TableRowManager(); 

    // SET THE PRIORITY BITMAP FIELD 
    // if high priority, display p1 bitmap 
    if (x % 2 == 0) { 
    row.add(new BitmapField(p1)); 
    } 
    // if priority is 2, set p2 bitmap 
    else if (x % 3 == 0) { 
    row.add(new BitmapField(p2)); 
    } 
    // if priority is 3, set p3 bitmap 
    else { 
    row.add(new BitmapField(p3)); 
    } 

    // SET THE TASK NAME LABELFIELD 
    // if overdue, bold/underline 
    LabelField task = new LabelField("Task #" + String.valueOf(x), 
    DrawStyle.ELLIPSIS); 
    // if due today, bold 
    if (x % 2 == 0) { 
    task.setFont(Font.getDefault().derive(
     Font.BOLD | Font.UNDERLINED)); 
    System.out.println("OVERDUE"); 
    } else { 
    task.setFont(Font.getDefault().derive(Font.BOLD)); 
    System.out.println("TODAY"); 
    } 

    row.add(task); 

    // SET THE LIST NAME 
    row.add(new LabelField("List Name #" + String.valueOf(x), 
    DrawStyle.ELLIPSIS) { 
    protected void paint(Graphics graphics) { 
    graphics.setColor(0x00878787); 
    super.paint(graphics); 
    } 
    }); 

    // SET THE DUE DATE/TIME 
    row.add(new LabelField("Due Date #" + String.valueOf(x), 
    DrawStyle.ELLIPSIS | LabelField.USE_ALL_WIDTH 
     | DrawStyle.RIGHT) { 
    protected void paint(Graphics graphics) { 
    graphics.setColor(0x00878787); 
    super.paint(graphics); 
    } 
    }); 
    rows.addElement(row); 
    } 
    setSize(rows.size()); 

} 

// ListFieldCallback Implementation 
public void drawListRow(ListField listField, Graphics g, int index, int y, 
    int width) { 
    TaskListField list = (TaskListField) listField; 
    TableRowManager rowManager = (TableRowManager) list.rows 
    .elementAt(index); 
    rowManager.drawRow(g, 0, y, width, list.getRowHeight()); 
} 

private class TableRowManager extends Manager { 
    public TableRowManager() { 
    super(0); 
    } 

    // Causes the fields within this row manager to be layed out then 
    // painted. 
    public void drawRow(Graphics g, int x, int y, int width, int height) { 
    // Arrange the cell fields within this row manager. 
    layout(width, height); 

    // Place this row manager within its enclosing list. 
    setPosition(x, y); 

    // Apply a translating/clipping transformation to the graphics 
    // context so that this row paints in the right area. 
    g.pushRegion(getExtent()); 

    // Paint this manager's controlled fields. 
    subpaint(g); 

    g.setColor(0x00CACACA); 
    g.drawLine(0, 0, getPreferredWidth(), 0); 

    // Restore the graphics context. 
    g.popContext(); 
    } 

    // Arrages this manager's controlled fields from left to right within 
    // the enclosing table's columns. 
    protected void sublayout(int width, int height) { 
    // set the size and position of each field. 
    int fontHeight = Font.getDefault().getHeight(); 
    int preferredWidth = getPreferredWidth(); 

    // start with the Bitmap Field of the priority icon 
    Field field = getField(0); 
    layoutChild(field, 32, 32); 
    setPositionChild(field, 0, 0); 

    // set the task name label field 
    field = getField(1); 
    layoutChild(field, preferredWidth - 16, fontHeight + 1); 
    setPositionChild(field, 34, 3); 

    // set the list name label field 
    field = getField(2); 
    layoutChild(field, 150, fontHeight + 1); 
    setPositionChild(field, 34, fontHeight + 6); 

    // set the due time name label field 
    field = getField(3); 
    layoutChild(field, 150, fontHeight + 1); 
    setPositionChild(field, preferredWidth - 152, fontHeight + 6); 

    setExtent(preferredWidth, getPreferredHeight()); 
    } 

    // The preferred width of a row is defined by the list renderer. 
    public int getPreferredWidth() { 
    return Graphics.getScreenWidth(); 
    } 

    // The preferred height of a row is the "row height" as defined in the 
    // enclosing list. 
    public int getPreferredHeight() { 
    return getRowHeight(); 
    } 
} 

public Object get(ListField listField, int index) { 
    return null; 
} 

public int getPreferredWidth(ListField listField) { 
    return 0; 
} 

public int indexOfList(ListField listField, String prefix, int start) { 
    return 0; 
} 

} 

Siehe Code von rtm4bb - A BlackBerry Client for Remember the Milk:

+0

I wirklich wie diese Antwort, es bewegt sich weg von allen Arten von Kauderwelsch in DrawListRow und ermöglicht es Ihnen tatsächlich, richtige Felder zu den Listfield hinzufügen, die ihre eigenen Bedenken zu behandeln. – Irwin

+5

+1 Ja, das ist ein netter Trick. Wenn die Liste jedoch lang ist, werden zu viele Objekte erstellt, wenn sie nicht für ihren natürlichen Zweck verwendet werden. Aus diesem Grund bietet die API 'ListField' - um Ressourcen auf langen Listen zu speichern. Ich würde es vorziehen, 'ListFieldCallback.drawListRow()' einfach zu implementieren. –

+0

Wirklich gutes Beispiel großen Dank für die Weitergabe :) – Grant

4

Ohne weitere Einzelheiten über das, was Sie versuchen zu tun, würde ich vorschlagen, einige der Beispiel-Apps zu sehen, die mit der BlackBerry-Entwicklungsumgebung geliefert werden. Einige der Apps wie Contacts.java und PhoneApiDemo.java haben eine ListField und ListFieldCallback Implementierung.

0

Beginnend mit Blackberry Java SDK 6.0 Sie RichList verwenden:

enter image description here

eine reiche Liste können Sie eine Liste der Elemente anzuzeigen, die ein optionales Bild auf der linken Seite eine Liste von Etikett neben dem Bild und eine optionalen Beschreibung unter dem Bild enthalten und Etikett

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."}); 
+0

@Downvoter: Interessieren Sie sich, warum der Downvote kommentieren? –

+0

Ich gebe Ihnen keinen Downvote, aber da Ihre Antwort nicht auf die Frage bezogen ist, ist 'RichList' keine anpassbare Implementierung von' ListField' – CAMOBAP