0

状況:-

私のコードでは、リストビュー コントロールに LWUIT コンポーネント オブジェクトを使用する必要があります。コントロールは動的であるため、任意の数にすることができます。今、私はコントロールに従って(数字で)コンポーネントオブジェクトを作成しています。つまり、最初に作成されるすべてのコントロールに対して、コンポーネントオブジェクトが作成されています。このプロセスは、コントロールが増加しているときにリストビューのレンダリングを遅くします。

解決:-

Component オブジェクトを作成し、それをすべてのコントロールのループで使用すると、オブジェクトの参照が取得されるため、すべてのリストビュー項目 (コントロール) が同じデータで表示されます。これで、オブジェクトのクローンを作成し、それを使用してコントロールを作成するという最後のオプションを考えることができます。

問題:-

しかし、オブジェクトのコピーを実現できる LWUIT の方法が見つかりません。

この問題を解決するための LWUIT の代替手段は何ですか?

PS-リストビュー項目は同じタイプですが、データが異なります。

4

1 に答える 1

2

リストコンポーネントとレンダラーデザインパターンを使用して、多数の要素を簡単に表示できる「ラバースタンプ」コンポーネントを作成します。これについては、CodenameOneブログを参照してください。

classこれらのesを最初に作成します:

public class ListUtil {

    private Vector data = new Vector();
    private Content[] contents;

    public ListUtil(Vector vData)
    {
        data = vData;
        contents = new Content[vData.size()];
    }

    public List createList(Display display, CListCell renderer, ActionListener listener)
    {
        CList theList;
        for(int i = 0; i < data.size(); i++)
        {
            contents[i] = new Content(String.valueOf(data.elementAt(i)));
        }
        theList = new CList(display, contents, renderer, listener);
        return theList;
    }
}

public class Content
{
    private String  row;

    public Content(String row)
    {
        this.row = row;
    }

    public String getRow()
    {
        return (row);
    }
}

public class CListCell extends Container implements ListCellRenderer {

    private Label focus = new Label("");

    public CListCell()
    {
        super();
        // create and add the components here among the components which will display data
    }
    public Component getListCellRendererComponent(List list, Object value, int index, boolean isSelected)
    {
        Content entry = null;
        if (value instanceof Content)
            entry = (Content)value;
        componentDisplayingDataAddedIntoThisListCellRenderer.setText(entry.getRow());
        return this;
    }
    public Component getListFocusComponent(List arg0)
    {
        return focus;
    }
}

public class CList extends List {
    private Display disp;
    public CList(Display display, Object[] data, CListCell renderer, ActionListener actionListener)
    {
        super(data);
        setListCellRenderer(renderer);
        setIgnoreFocusComponentWhenUnfocused(true);
        addActionListener(actionListener);
        setScrollAnimationSpeed(getScrollAnimationSpeed()/4);
        disp = display;
    }
    public void pointerReleased(int x,int y)
    {
        if (isEnabled() && hasFocus())
            super.pointerReleased(x, y);
    }
    public void keyReleased(int keyCode)
    {
        if (isEnabled() && hasFocus())
        {
            if (disp.getGameAction(keyCode) == Display.GAME_FIRE)
                pointerReleased(getX(),getY());
            else
                super.keyReleased(keyCode);
        }
    }
}

を作成してList追加するにはForm

public class myForm extends Form implements ActionListener
{
    private Vector listSource = // your vector of data
    private CListCell renderer = new CListCell();
    private List theList = (new ListUtil(listSource)).createList(Display.getInstance(),renderer, this);
    ...
    public void actionPerformed(ActionEvent evt)
    {
       if (evt.getSource() == theList)
            doSomething();
    }
}
于 2012-04-05T05:30:23.990 に答える