2011-01-06 81 views
1

我正在显示一个自定义的列表字段,其中右侧的文本和左侧的图像都是动态显示的。最初,我在列表字段的左侧放置一个空白图像,然后调用URLBitmapField类的setURL方法,该方法实际上执行处理并将处理后的图像放置在空白图像的顶部。图像显示在列表字段上,但显示在看到处理过的图像我需要点击列表字段图像。我希望处理后的图像在处理后自动显示在列表字段中。任何人都可以告诉我我错了哪里?我一直在寻求帮助,但没有一个似乎要弄清楚problem.Any富有成效的建议,将不胜感激来自URL的ListField显示图像

import java.util.Vector; 
import net.rim.device.api.system.Bitmap; 
import net.rim.device.api.system.Display; 
import net.rim.device.api.ui.ContextMenu; 
import net.rim.device.api.ui.DrawStyle; 
import net.rim.device.api.ui.Field; 
import net.rim.device.api.ui.Font; 
import net.rim.device.api.ui.Graphics; 
import net.rim.device.api.ui.Manager; 
import net.rim.device.api.ui.MenuItem; 
import net.rim.device.api.ui.UiApplication; 
import net.rim.device.api.ui.component.BitmapField; 
import net.rim.device.api.ui.component.Dialog; 
import net.rim.device.api.ui.component.LabelField; 
import net.rim.device.api.ui.component.ListField; 
import net.rim.device.api.ui.component.ListFieldCallback; 
import net.rim.device.api.ui.component.NullField; 
import net.rim.device.api.ui.container.FullScreen; 
import net.rim.device.api.ui.container.MainScreen; 
import net.rim.device.api.ui.container.VerticalFieldManager; 
import net.rim.device.api.util.Arrays; 
import net.rim.device.api.ui.component.ListField; 

public class TaskListField extends UiApplication { 
    // statics 
    // ------------------------------------------------------------------ 
    public static void main(String[] args) { 
     TaskListField theApp = new TaskListField(); 
     theApp.enterEventDispatcher(); 
    } 

    public TaskListField() { 
     pushScreen(new TaskList()); 
    } 

} 

class TaskList extends MainScreen implements ListFieldCallback { 
    private Vector rows; 
    private Bitmap p1; 
    private Bitmap p2; 
    private Bitmap p3; 
    String Task; 
    ListField listnew = new ListField(); 
    private VerticalFieldManager metadataVFM; 
    TableRowManager row; 



    public TaskList() { 
     super(); 
     URLBitmapField artistImgField; 
     listnew.setRowHeight(80); 
     listnew.setCallback(this); 
     rows = new Vector(); 
     for (int x = 0; x <3; x++) { 

       row = new TableRowManager(); 

      artistImgField = new URLBitmapField(Bitmap 
        .getBitmapResource("res/images/bg.jpg")); 

      row.add(artistImgField); 

      String photoURL = "someimagefrmurl.jpg"; 
      Log.info(photoURL); 

      // strip white spaces in the url, which is causing the 
      // images to not display properly 
      for (int i = 0; i < photoURL.length(); i++) { 
       if (photoURL.charAt(i) == ' ') { 
        photoURL = photoURL.substring(0, i) + "%20" 
          + photoURL.substring(i + 1, photoURL.length()); 
       } 
      } 
      Log.info("Processed URL: " + photoURL); 
      artistImgField.setURL(photoURL); 



      LabelField task = new LabelField("Display"); 

      row.add(task); 

      LabelField task1 = new LabelField(
        "Now Playing" + String.valueOf(x)); 


      Font myFont = Font.getDefault().derive(Font.PLAIN, 12); 
      task1.setFont(myFont); 

      row.add(task1); 


      rows.addElement(row); 
     } 
     listnew.setSize(rows.size()); 


     this.add(listnew); 
     //listnew.invalidate(); 
    } 

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

     rowManager.drawRow(g, 0, y, width, listnew.getRowHeight()); 
    } 
    protected void drawFocus(Graphics graphics, boolean on) { 
    } 



    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, 146,80); 
      setPositionChild(field, 0, 0); 

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

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


      setExtent(360, 480); 

     } 

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

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

    public Object get(ListField listField, int index) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    public int getPreferredWidth(ListField listField) { 

    return 0; 
    } 

    public int indexOfList(ListField listField, String prefix, int start) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

} 
+0

是由于注重以无焦点的问题,问题是,处理后的图像获取列表领域的空白图像替换很好,但要查看图像,我需要点击特定列表字段项。我希望它自动显示图像,而不会被聚焦或未聚焦 – arunabha 2011-01-06 13:56:26

回答

0

最后我解决了这个问题我自己的。这工作:

UiApplication.getUiApplication().invokeLater(
    new Runnable() { 
     public void run() { 
      listnew.invalidate(); 
     } 
    },500,true);