Blackberry 6: ListField - ограничить количество отображаемых строк? - PullRequest
1 голос
/ 05 апреля 2011

У меня вопрос по поводу ListField :

Если я позвоню setSize (16) , то я укажу, сколько элементов содержит этот компонент.Как мне тогда контролировать высоту этого компонента?

Например, я использую приведенный ниже код для отображения TextField и ListField ниже, но я также хотел бы показать ButtonField подListField:

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

Спасибо!Alex

ОБНОВЛЕНИЕ:

Может быть, ListField должен всегда показывать все свои элементы, и вы не можете ограничить его просмотр несколькими строками?

1 Ответ

3 голосов
/ 05 апреля 2011

Это, вероятно, не совсем то, что вы запрашиваете, но не могли бы вы попытаться поместить свою кнопку в контейнер состояния вашего экрана?Это был бы самый простой способ иметь кнопку внизу экрана.Однако в этом случае кнопка останется там независимо от размера списка (количества элементов).

Класс 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 (Model-View-Controller).Несомненно, это не идеально.ListField - это старый базовый класс BB API, который не менялся годами.Я думаю, если бы у них был второй шанс, API был бы намного лучше.Например, в списках Android API намного лучше.Я также нахожу ListField.setSize() немного уродливым, но мы не можем это изменить, и мы можем вручную указать ListField, что базовый список изменил свой размер.

Точка около ListFieldCallbackиспользование.При таком подходе ListField сам ничего не знает о том, что на самом деле элементы списка.До ListFieldCallback можно вернуть объект элемента списка по запросу или нарисовать представление элемента списка по запросу.Обратите внимание, что это происходит по запросу.ListField просит ListFieldCallback рисовать только те элементы, которые видны на экране.Это очень важно с точки зрения скорости и использования оперативной памяти.Если ваш список состоит из 1000 элементов, и каждый элемент подразумевает рисование значка, который должен быть загружен из сети (или просто считан из файловой системы), то подготовка всего списка данных за один раз была бы показательной пробкой.Но с ListFieldCallback вы можете обрабатывать только те элементы, которые запрашиваются, поэтому вы можете реализовать отложенную загрузку, и ваш список становится максимально быстрым.

Для некоторых простых случаев (когда ваше представление listItem UI можетполучить только по телефону listItem.toString()) есть класс ObjectListField.Этот класс уже реализует ListFieldCallback, поэтому он отображает список прямо из коробки.

...