2013-10-09 10 views
1

응용 프로그램에 다음과 같이 구현하고 싶습니다. enter image description here 즉, 각 이미지에 하트 아이콘 하나가 포함되어 있습니다. 나는 마음 클릭에 클릭 이벤트를 처리하는 원하고 그것을 위해 나는이미지가있는 블랙 베리의 사용자 지정 목록

여기
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'위치를 무시한다는 문제가있는 것 같습니다 :

효과적으로 당신이 현재 행 (INT 인덱스를 사용하여 식별 행)을 그리는 데 사용되어야한다 '캔버스'사각형 에 의해 묶여있다
 public void drawListRow(ListField list, Graphics graphics, 
       int index, int y, int w) { 

(list.getRowHeight, 승, 0, y를()) .

사실 실제로 ListField에 속한 범위 내 어디에서나 페인트 할 수 있습니다. 즉, 페인트 할 수있는 영역은 실제로 사각형입니다. (0, list.getWidth(), list.getHeight()) . 이 작업을 수행 할 수 있지만 그렇게해서는 안됩니다. 행의 사각형 밖으로 나가면 다른 행에 페인팅됩니다.

경우에 따라 선택한 행 외부의 페인팅이 코드에서 수행하는 것과 정확하게 일치합니다. 이 작업을 수행 : 왼쪽과 Display.getHeight()에서의

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

이 실제로의 ListField에 위치되며, 10 픽셀 - 아래 위로부터 150. 그리는 행에 관계없이 ListField의이 지점에 배치됩니다. 그래서 모든 행은 Hello 텍스트를 같은 위치에 놓을 것입니다.

그래서 drawListRow()를 코딩 할 때 페인팅해야하는 행 경계 내에서 유지되도록 모든 위치를 오프셋해야합니다. 그림을 그릴 영역의 원점은 (0, y)이므로 y를 사용하여 모든 수직 위치를 오프셋합니다. Display.getHeight()를 사용하지 말고 list.getRowHeight()를 사용하여 칠할 수있는 높이를 가져오고 (y에서 시작) Display.getWidth()를 사용하지 말고 전달 된 w 변수를 사용하여 너비를 가져옵니다 페인트 칠 수 있어요. 모든 그래픽 작업은이 범위 내에서 이루어져야합니다.

+0

심장 아이콘 –

+0

에서 클릭 이벤트 수행 방법을 알려주시겠습니까? 행의 아무 곳이나 클릭 할 수 있다면 간단합니다. navigationClick()을 재정의하십시오. 하트의 클릭이 행의 다른 곳에서의 클릭과 다른 경우에는 ListField에서 지원되지 않습니다. ListField는 포커스와 클릭이 행의 특정 부분이 아닌 행에서 지정되도록합니다. 이 문제를 해결하기위한 코딩 방법이 있지만 꽤 좋지는 않습니다. 따라서 행 수가 적고 (30 개 미만), 이것이 필수적이라면 다른 접근 방식을 사용하십시오. 각 행에 대해 HorizontalFieldManager를 만들고 행을 VerticalFieldManager에 추가합니다. 또는 GridFieldManager 또는 TableLayoutManager를 사용하십시오. –

+0

같은 코드를 구현하기 위해 @NATE에 의해 작성된 코드를 찾았지만이 경우 이미지는 정적이지만 내 경우에는 이미지가 다운로드되고 이미지가 많이있을 수 있습니다. 양식 웹 서비스. 동일한 코드를 구현할 수 있습니까? 다음은 동일한 네이트 구현을위한 링크입니다. http://stackoverflow.com/questions/11483128/custom-list-field-click-event/11486480#11486480 –