1

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 は常にすべての項目を表示することになっていて、そのビューを数行に制限することはできませんか?

4

1 に答える 1

3

これはおそらくあなたが求めているものとは正確には異なりますが、ボタンを画面のステータス コンテナーに配置してみてください。これは、画面の下部にボタンを配置する最も簡単な方法です。ただし、この場合、リストのサイズ (アイテムの数) に関係なく、ボタンはそこにとどまります。

クラス 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.

アップデート:

あなたはなぜこれがそのままなのかと尋ねています。そうですね、これは何らかのMVC (Model-View-Controller) パターンを実装しようとする RIM の試みでした。理想的ではないことは間違いありません。ListField何年も変更されていない古いコア BB API クラスです。もう一度チャンスがあれば、API はもっと良くなると思います。たとえば、Android のリストでは API の方がはるかに優れています。私もListField.setSize()少し醜いと思いますが、これを変更することはできませんListField。基になるリストのサイズが変更されたことを手動で指示するのは私たち次第です。

ListFieldCallback使い方のポイント。このアプローチListField自体では、リスト項目が実際に何であるかについて何も知りません。ListFieldCallback要求に応じてリスト項目オブジェクトを返すか、要求に応じてリスト項目表現を描画するかは、次第です。これはリクエストに応じて行われることに注意してください。画面に表示されているアイテムのみを描画するように にListField要求します。ListFieldCallbackこれは、速度と RAM 使用量の点で非常に重要です。リストが 1000 項目で、各項目がネットワークからロードする (または単にファイル システムから読み取る) アイコンを描画することを意味する場合、リスト データ全体を一度に準備すると、目立たなくなります。ただし、ListFieldCallback要求されたアイテムのみを処理できるため、遅延読み込みを実装すると、リストができるだけ速くなります。

単純なケース ( を呼び出すだけで listItem UI 表現を取得できる場合listItem.toString()) には、ObjectListFieldクラスがあります。このクラスはすでに を実装しているListFieldCallbackため、すぐにリストを表示できます。

于 2011-04-05T14:57:55.763 に答える