2013-01-06 19 views
0

我在寫一個自定義列表字段,但當我調用invalidate方法時它不起作用。屏幕總是空的,而列表字段的數據不是空的或空的! 請幫我弄清楚問題所在。
預先感謝您ListField的方法invalidate不起作用

public class FileListField extends ListField implements ListFieldCallback{ 

    private static final Bitmap fileBitmap = Bitmap.getBitmapResource("document.png"); 
    private static final Bitmap dirBitmap = Bitmap.getBitmapResource("emty_folder.png"); 
    private static final Bitmap addBitmap = Bitmap.getBitmapResource("svn_added.png"); 
    private static final Bitmap delBitmap = Bitmap.getBitmapResource("svn_deleted.png"); 
    private static final Bitmap modBitmap = Bitmap.getBitmapResource("svn_modified.png"); 
    private static final Bitmap novBitmap = Bitmap.getBitmapResource("svn_noversion.png"); 
    private static final Bitmap norBitmap = Bitmap.getBitmapResource("svn_normal.png"); 
    //static Bitmap dowBitmap = Bitmap.getBitmapResource("svn_added.png"); 

    private BigVector bv; 

    public FileListField(){ 
     super(); 
     bv = new BigVector(); 
     setCallback(this); 
    } 

    public void setFileModelVector(BigVector fileModelVector){ 
     bv.removeAll(); 
     bv.addElements(fileModelVector.getContiguousArray()); 
     invalidate(); 
     System.out.println("ISSSSSSSSSSSSSS CALLLLLLLLLLINNNNNNNG?"); 
     System.out.println("DISSSPATH?"+UiApplication.isEventDispatchThread()); 
//  invalidateRange(0, bv.size()-1); 
//  FileModel[] fileModelArr = new FileModel[fileModelVector.size()]; 
//  for(int i=0;i<fileModelVector.size();i++) 
//   fileModelArr[i] = (FileModel)fileModelVector.elementAt(i); 
//  set(fileModelArr); 
    } 

    public BigVector getFileModelVector(){ 
//  BigVector bv = new BigVector(); 
//  for(int i=0;i<this.getSize();i++) 
//   bv.addElement(get(this, i)); 
     return bv; 
    } 

    public void set(Object[] or){ 

    } 

    public Object get(ListField list, int index){ 
     return bv.elementAt(index); 
    } 

    public int getSize(){ 
     return bv.size(); 
    } 

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

    public int getPreferredWidth(ListField listField) { 
     return Display.getWidth(); 
    } 

    public void drawListRow(ListField listField, Graphics graphics 
      , int index, int y, int width){ 
     System.out.println("DRWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"); 
     FileModel fileModel = (FileModel)get(listField, index); 
     if(fileModel.isFile()) 
      graphics.drawBitmap(0, y, width, fileBitmap.getHeight() 
        , fileBitmap, 0, 0); 
     else 
      graphics.drawBitmap(0, y, width, dirBitmap.getHeight() 
        , dirBitmap, 0, 0); 
     switch(fileModel.getStatus()){ 
      case FileModel.ADD_STATUS: 
       graphics.drawBitmap(0, y, width, addBitmap.getHeight() 
         , addBitmap, 0, 0); 
       break; 
      case FileModel.DEL_STATUS: 
       graphics.drawBitmap(0, y, width,delBitmap.getHeight() 
         , delBitmap, 0, 0); 
       break; 
      case FileModel.MOD_STATUS: 
       graphics.drawBitmap(0, y, width, modBitmap.getHeight() 
         , modBitmap, 0, 0); 
       break; 
      case FileModel.DOW_STATUS: 
       break; 
      case FileModel.NOR_STATUS: 
       graphics.drawBitmap(0, y, width, norBitmap.getHeight() 
         , norBitmap, 0, 0); 
       break; 
      default: 
       graphics.drawBitmap(0, y, width, novBitmap.getHeight() 
         , novBitmap, 0, 0); 
       break; 
     } 
     graphics.drawText(fileModel.getName(), fileBitmap.getWidth(), y); 
    } 

} 

回答

0

我不認爲你的ListField調用invalidate()就足夠了。 invalidate()調用確實是一個View layer方法,表示該字段必須重新繪製。你真正在做的是表明Model已經改變。

See this other question on Stack Overflow

試着改變你的代碼,這樣的事情,使用的setSize():

public void setFileModelVector(BigVector fileModelVector){ 
    bv.removeAll(); 
    bv.addElements(fileModelVector.getContiguousArray()); 
    //invalidate(); 
    setSize(bv.size()); 
} 

我也不知道你究竟是如何處理的載體本身的所有權,但你也可能只是這樣做:

public void setFileModelVector(BigVector fileModelVector){ 
    bv = fileModelVector; 
    //invalidate(); 
    setSize(bv.size()); 
} 

由於您清除了整個向量,然後將新向量轉換爲數組,然後添加ar射線到原始矢量。但是,這是一個單獨的問題,並不是你看到一個空的ListField的原因。

+0

我試過使用setSize,但它拋出ArrayIndexOutOfException –

+0

好吧,我認爲這實際上是一個**不同的問題。我認爲這是因爲你正在使用'BigVector'。我相信,如果你有一個'BigVector',它被初始化爲一定的大小,假設你將有很多元素(這就是爲什麼它叫** Big ** Vector)。我認爲'bv.size()'返回的尺寸大於實際放置在矢量中的元素的數量,假設您還沒有放置很多元素。所以,你需要決定如何重寫你的代碼,以確保你正確地跟蹤實際的矢量大小。這真的是一個不同的問題... – Nate

+0

@CongNguyen,嘗試調試或登錄你的代碼,並打印'bv.size()'的值。我敢打賭,你會發現它比你想象的要大,而且在其他地方(可能在'bv.elementAt(index)')中,你要求一個元素超過實際列表的末尾。 – Nate