2013-10-09 32 views
1

我想在我的應用程序中實現像這樣的東西:enter image description here 也就是說,每個圖像包含一個心臟圖標。我想要處理對心臟Click事件和我有以下代碼黑莓中的圖像自定義列表

list.setEmptyString("No Image Available", DrawStyle.HCENTER); 
      list.setRowHeight(Display.getHeight() - 100); 
      list.setSize(data.size()); 
      if (listVManager != null && listVManager.getFieldCount() > 0) { 
       listVManager.deleteAll(); 
      } 

      list.setCallback(new ListFieldCallback() { 
       public void drawListRow(ListField list, Graphics graphics, 
         int index, int y, int w) { 
        int yPos = y + list.getRowHeight() - 1; 
        graphics.setColor(0x434343); 
        graphics.fillRect(0, y, w, list.getRowHeight()); 

        if (logoThumbnailImage != null 
          && logoThumbnailImage.length > index 
          && logoThumbnailImage[index] != null) { 
         EncodedImage img = logoThumbnailImage[index]; 
         graphics.drawImage(0, y + 10, Display.getWidth(), 
           Display.getHeight() - 100, img, 0, 0, 0); 

         graphics.drawText("Hello", 10, 
           Display.getHeight() - 150); 
         graphics.drawImage(Display.getWidth() - 70, 
           Display.getHeight() - 150 + 300, 
           heart.getWidth(), heart.getHeight(), heart, 
           0, 0, 0); 
        } else { 
         graphics.drawImage(
           15, 
           y + 10, 
           Display.getWidth(), 
           Display.getHeight() - 100, 
           sizeImage(iconImage, Display.getWidth(), 
             Display.getHeight() - 100), 0, 0, 0); 

        } 

        graphics.drawText("Hello", 10, 
          Display.getHeight() - 150); 
        graphics.drawLine(0, yPos, w, yPos); 

       } 

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

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

       public int indexOfList(ListField listField, String prefix, 
         int start) { 
        return 0; 
       } 
      }); 
      listVManager.add(list); 
      loadImages = new LoadImages(80, 80); 
      loadImages.start(); 
     } 
    }); 

這裏負荷的形象是線程的背景下,載入圖像,並將它們存儲在logoThumbnailImage陣列,並從那裏無效列表時它加載圖像。

負載圖像線程類:

private class LoadImages extends Thread { 

    int widthL; 
    int heightL; 
    LoadImages(int width, int height) { 
     this.widthL = width; 
     this.heightL = height; 
    } 

    public void run() { 
     logoThumbnailImage=new EncodedImage[numberOfItem]; 
     if (object != null) { 
      for (int i = 0; i < numberOfItem; i++) {     
        try { 
         String text=object[i].getJSONArray("UrlArray").getString(0).toString(); 
         EncodedImage encodedImg = JPEGEncodedImage.encode(connectServerForImage(text), quality); //connectserverForImage load Images from server      
         logoThumbnailImage[i] = sizeImage(encodedImg, Display.getWidth(), Display.getHeight()-100); 
         list.invalidate(); 


       } catch (Exception e) 
       { 
         e.printStackTrace(); 
        } 

      } 
     } else { 
      UiApplication.getUiApplication().invokeLater(new Runnable() { 
       public void run() { 
        Dialog.alert("No Data Found"); 
       } 
      }); 
     } 
    } 
} 

應用程序運行順利,但我得到了以下的輸出: enter image description here

我有以下問題 1.心臟和說明顯示只一個列表行。任何人都可以告訴我我錯過了什麼嗎? 2.如何執行心臟上的點擊事件

回答

3

僅僅簡單地看過這個問題,問題似乎是你在某些地方忽略了傳遞給你的drawListRow()方法的'y'位置:

 public void drawListRow(ListField list, Graphics graphics, 
       int index, int y, int w) { 

有效的「畫布」,你應該使用油漆當前行(使用INT索引對應的行)由矩形 界(0,Y,W,list.getRowHeight()) 。實際上,你實際上可以在屬於ListField的範圍內的任何地方繪製,也就是說,你可以繪製的區域實際上是矩形 (0,0,list.getWidth(),list.getHeight()) 。 你可以做到這一點,但你不應該。如果你走出你的排的矩形,你會在另一排上畫。

就你的情況而言,在選定行外繪畫正是你的代碼所做的。你這樣做:

   graphics.drawText("Hello", 10, 
         Display.getHeight() - 150); 

這實際上將定位在ListField,10個像素從左和Display.getHeight() - 150從上而下。無論您正在繪製哪一行,它都將位於ListField的此位置。所以每一行都會將Hello文本放在同一個地方。

所以,當編碼你的drawListRow()時,確保你抵消了所有的位置,以保持在你應該畫的行範圍內。您正在繪製區域的原點是(0,y),因此使用y偏移所有垂直位置。不要使用Display.getHeight(),使用list.getRowHeight()來獲取可以繪製的高度(從y開始),並且不要使用Display.getWidth(),使用傳入的w變量來獲取寬度你可以畫畫。所有圖形操作都應該在這些範圍內發生。

+0

你能告訴我如何在心臟圖標上執行點擊事件嗎 –

+0

如果你可以點擊該行的任何地方,這很簡單,可以覆蓋navigationClick()。如果點擊心臟不同於該行其他位置的點擊,則不支持ListField。一個ListField期望焦點和點擊針對該行,而不是該行的特定部分。有編碼的方法,但它們並不漂亮。所以如果你只有幾行(比如少於30),這是必不可少的,那就用另一種方法。爲每一行創建一個Horizo​​ntalFieldManager,並將這些行添加到VerticalFieldManager。或者使用GridFieldManager或TableLayoutManager。 –

+0

我發現@NATE編寫的代碼實現了相同的功能,但在這種情況下,圖像是靜態的,但在我的情況下,圖像正在下載(並且圖像可能很多)形式的Web服務。我可以實現相同的代碼嗎?這裏是相同的nate實現的鏈接http://stackoverflow.com/questions/11483128/custom-list-field-click-event/11486480#11486480 –