2011-04-05 75 views
1

我有一個關於ListField問題:Blackberry 6:ListField - 限制顯示行數?

如果我打電話的setSize(16)然後我指出,這種成分有多少項目包含的內容。那麼我如何控制這個組件的高度呢?

例如我使用下面的代碼來顯示一個TextField和下方的ListField,但我也想顯示的ListField下方的ButtonField字段:

enter image description here

MyScreen.java:

private MyList presetList = new MyList(); 

private MyScreen() { 
    setTitle("Favorites"); 

    BasicFilteredList filterList = new BasicFilteredList();   
    String[] days = {"Monday","Tuesday","Wednesday", 
        "Thursday","Friday","Saturday","Sunday"}; 
    int uniqueID = 0; 
    filterList.addDataSet(uniqueID,days,"days",BasicFilteredList.COMPARISON_IGNORE_CASE); 
    AutoCompleteField autoCompleteField = new AutoCompleteField(filterList); 
    add(autoCompleteField);   

    presetListField.setRowHeight(-2); 
    presetListField.setCallback(presetList); 
    presetListField.setSize(MyList.items.length()); 
    add(presetListField); 
} 

MyList.java:

public class MyList implements ListFieldCallback { 
    public static String items[] = { 
      "Favorite 01", "Favorite 02", "Favorite 03", "Favorite 04", 
      "Favorite 11", "Favorite 12", "Favorite 13", "Favorite 14", 
      "Favorite 21", "Favorite 22", "Favorite 23", "Favorite 24", 
      "Favorite 31", "Favorite 32", "Favorite 33", "Favorite 34" 
    }; 

    public void drawListRow(ListField listField, Graphics g, int index, int y, int width) { 
     Font f = g.getFont(); 
     Font b = f.derive(Font.BOLD, f.getHeight() * 2); 

     g.setColor(Color.WHITE); 
     g.drawText(items[index], Display.getWidth()/3, y); 
     g.drawText("Click to get frequency", Display.getWidth()/3, y + g.getFont().getHeight()); 

     g.setFont(b); 
     g.setColor(Color.YELLOW); 
     g.drawText("100." + index, 0, y); 
    } 

    public Object get(ListField list, int index) { 
     return items[index]; 
    } 

    public int indexOfList(ListField list, String p, int s) { 
     return -1; 
    } 

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

謝謝! 亞歷

UPDATE:

也許ListField應該總是顯示其所有項目,並不能限制其幾行看法?

回答

3

這可能並不完全符合您的要求,但您是否可以嘗試將按鈕置於屏幕的狀態容器中?這將是在屏幕底部有按鈕的最簡單的方法。但是,在這種情況下,無論列表大小(項目數量)如何,按鈕都將保持在那裏。

類MainScreen

公共無效setStatus(場狀態)

Sets the contents of this screen's status section. 

This method adds your provided field to this screen's status section, 
even if it already contains a field. 

Parameters: 
    status - New status field. 

UPDATE:

你問這是爲什麼,因爲它是。那麼,正如我所看到的那樣,這是RIM試圖實施某種MVC(模型 - 視圖 - 控制器)模式的嘗試。毫無疑問,這並不理想。 ListField是一個多年沒有改變的老核心BB API類。我想如果他們有第二次機會API會好得多。例如,在Android列表中,API更好。我也發現ListField.setSize()有點難看,但我們無法改變這一點,我們需要手動指示ListField底層列表已經改變了大小。

約有ListFieldCallback的使用情況。通過這種方法,ListField本身對什麼是實際的列表項目一無所知。到ListFieldCallback最多可以根據請求返回列表項目對象或根據請求繪製列表項目表示。請注意這是根據請求發生的ListField要求ListFieldCallback僅繪製屏幕上可見的項目。這在速度和RAM使用方面非常重要。如果您的列表是1000個項目,並且每個項目意味着繪製一個應該從網絡加載的圖標(或者只是從文件系統讀取),那麼一次準備整個列表數據將成爲顯示屏。但通過ListFieldCallback您只能處理請求的項目,因此您可以實現延遲加載,並且列表儘可能快。

對於一些簡單的情況(當您的listItem UI表示可以通過調用listItem.toString()獲得)時,有ObjectListField類。此課程已實施ListFieldCallback,因此它立即顯示列表。

+0

是的,這將是一個解決方法謝謝。但我想了解ListField的用法,因爲這是一個非常受歡迎的組件。 – 2011-04-05 15:39:13

+0

@Alexander Farber:請參閱UPDATE部分。 – 2011-04-05 18:37:42

+0

是的,謝謝,我認爲ListField是一個很好的組件。如果我想設置其可見行數,我已經從離線得到了應該編寫自己的管理器的答案。 – 2011-04-14 19:30:34