Blackberry 6:ListField - 限制显示的行数?

时间:2011-04-05 13:54:38

标签: blackberry listfield

我对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();
     }
}

谢谢! 亚历

更新

也许ListField应该始终显示其所有项目,并且您不能将其视图限制为几行?

1 个答案:

答案 0 :(得分:3)

这可能不是您要求的,但是您可以尝试将按钮放入屏幕的状态容器中吗?这是将按钮放在屏幕底部的最简单方法。但是在这种情况下,无论列表大小(项目数)如何,按钮都将保持在那里。

  

Class MainScreen

     

public void setStatus(Field status)

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.

<强>更新

你在问为什么会这样。好吧,正如我所看到的那样,这是RIM尝试实现某种MVC(模型 - 视图 - 控制器)模式。毫无疑问,它并不理想。 ListField是一个旧的核心BB API类,多年来一直没有变化。我想如果他们有第二次机会,那么API会好得多。例如,在Android列表上,API要好得多。我还发现ListField.setSize()有点难看,但是我们无法改变这一点,我们有责任手动指示ListField基础列表已经改变了它的大小。

关于ListFieldCallback用法的观点。使用这种方法ListField本身对列表项实际上是什么一无所知。根据请求返回列表项对象或在请求时绘制列表项表示最多为ListFieldCallback。请注意,这是根据要求发生ListField要求ListFieldCallback仅绘制屏幕上可见的项目。这在速度和RAM使用方面非常重要。如果您的列表是1000个项目,并且每个项目意味着绘制一个应该从网络加载的图标(或者只是从文件系统中读取),那么立即准备整个列表数据应该是一个显示停止。但是使用ListFieldCallback,您只能处理请求的项目,因此您可以实现延迟加载,并且列表变得尽可能快。

对于一些简单的情况(只能通过调用listItem.toString()获得listItem UI表示),有ObjectListField类。这个类已经实现了ListFieldCallback,所以它显示了开箱即用的列表。