【问题标题】:Blackberry 6: ListField - limit the number of displayed rows?Blackberry 6:ListField - 限制显示的行数?
【发布时间】:2011-04-05 13:54:37
【问题描述】:

我有一个关于ListField的问题:

如果我调用 setSize(16),那么我会指出该组件包含多少项。那么如何控制这个组件的高度呢?

例如我使用下面的代码在下面显示一个TextField和一个ListField,但我也想在ListField下面显示一个ButtonField:

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 应该始终显示其所有项目,而您不能将其视图限制为几行?

【问题讨论】:

    标签: blackberry listfield


    【解决方案1】:

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

    类 MainScreen

    public void 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.
    

    更新:

    你在问为什么会这样。好吧,在我看来,这是 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,所以它直接显示列表。

    【讨论】:

    • 是的,这是一种解决方法,谢谢。但我也想了解 ListField 的用法,因为这是一个非常流行的组件。
    • @Alexander Farber:请参阅更新部分。
    • 是的,谢谢,我认为 ListField 是一个很好的组件。我从离线得到的答案是,如果我想设置它的可见行数,我应该编写自己的 Manager。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多