2

Eclipse でLWUITを使用してj2meでS60を実行しています。

描画リストの参照用に、このチュートリアル リンクを使用しています。

しかし、リスト要素描画の位置を印刷しましたが、複数回呼び出されました(3〜4回だと思います)理由がわかりませんか?

また、リストの応答性も悪く、下にスクロールするのに時間がかかります。

LWUITリストのいくつかのビデオの例を見たように、リストがなぜできないので、それらはより速く、よりスムーズに動作していますか??

受け取ったjsonから値を解析してリストに追加する私のコード

public void setNotificationList(String response) {

    if (!response.equals("") || response != null) {

        try {
            JSONObject jsonObject = new JSONObject(response);
            if (jsonObject != null) {
                if (jsonObject.getInt("total") > 0) {
                    totalNotificationPages = jsonObject
                            .getInt("total_pages");

                    JSONArray notificationJsonArray = jsonObject
                            .getJSONArray("notifications");
                    int lenghtOfList = notificationJsonArray.length();

                    if (!moreNotificationListFalg) {
                        notificationList = new List();
                    } else {
                        notificationVector.removeAllElements();
                    }

                    notificationVector = new Vector(lenghtOfList);

                    for (int i = 0; i < lenghtOfList; i++) {

                        JSONObject notificationJsonObjects = notificationJsonArray
                                .getJSONObject(i);
                        UpdatesUserData notificationData = new UpdatesUserData();

                        notificationData.user_id = JSONHelper
                                .getStringFromJSON(notificationJsonObjects,
                                        "user_id");
                        notificationData._id = JSONHelper
                                .getStringFromJSON(notificationJsonObjects,
                                        "id");
                        notificationData.message = JSONHelper
                                .getStringFromJSON(notificationJsonObjects,
                                        "message");

                        notificationData.date = JSONHelper
                                .getStringFromJSON(notificationJsonObjects,
                                        "created_at");

                        // Helper.stringToDate(JSONHelper.getStringFromJSON(notificationJsonObjects,
                        // "created_at"));
                        // Helper.createDate(JSONHelper.getStringFromJSON(notificationJsonObjects,
                        // "created_at"));

                        notificationData.distance = JSONHelper
                                .getStringFromParentJSON(
                                        notificationJsonObjects, "user",
                                        "distance");

                        if (notificationJsonObjects.has("user")) {
                            JSONObject jsonObjectParent = notificationJsonObjects
                                    .getJSONObject("user");

                            notificationData.user_image = APIHelper
                                    .getPictureUrl(
                                            JSONHelper
                                                    .getStringFromParentJSON(
                                                            jsonObjectParent,
                                                            "profile",
                                                            "avatar_thumb"),
                                            JSONHelper
                                                    .getStringFromParentJSON(
                                                            jsonObjectParent,
                                                            "profile",
                                                            "picture_url"));

                        }
                        System.out.println("User Image "
                                + notificationData.user_image);
                        notificationVector.addElement(notificationData);

                    }// for loop ends

                    System.out.println("Displaying user Notification list");

                    // check if Update List Exists then remove it and Add
                    // this Notification List

                    if (form.contains(updateList)) {
                        form.removeComponent(updateList);
                        System.out.println(" Update List removed...");
                    }
                    if (form.contains(moreUpdates)) {
                        form.removeComponent(moreUpdates);
                        System.out.println(" moreUpdate removed... ");
                    }

                    // ----------------------------------------------------

                    // Getting index of lat element of List before adding
                    // new elements to it
                    int index = notificationList.size();

                    if (notificationVector.size() > 0) {

                        // Adding elements to notification vector
                        for (int i = 0; i < notificationVector.size(); i++) {
                            notificationList.addItem(notificationVector
                                    .elementAt(i));
                        }

                        System.out.println("Adding List ");

                        if (!moreNotificationListFalg) {
                            notificationList
                                    .setRenderer(new UpdatesListCellRenderer(
                                            false));

                            form.addComponent(notificationList);
                        } else {

                            notificationList.setSelectedIndex(index - 1);
                            notificationList.repaint();
                        }

                        // Addgin more... Btn if pages are more than 1
                        if (totalNotificationPages > notificationPageNo)
                            form.addComponent(moreUpdates);

                        // Adding ActionListener to list
                        notificationList
                                .addActionListener(new ActionListener() {

                                    public void actionPerformed(
                                            ActionEvent arg0) {

                                        form.setFocused(notificationTabBtn);

                                    }
                                });
                    }
                    moreNotificationListFalg = false;// setting flag false
                    form.invalidate();
                    form.repaint();

                } else {
                    System.out.println("List has not Elements to print.");
                }
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

    }

}

私のレンダラークラス

public class UpdatesListCellRenderer extends Container implements
        ListCellRenderer {

    private Label message = new Label("");
    private Label distance = new Label("");
    private Label profile_image = new Label("");
    private Label date = new Label("");
    private Label focus = new Label();
    private Font font;
    public Container base_container;
    private Container containerY,containerX;
    private Resources resources;
    private boolean flag = false;
    private Button moreUpdates = new Button();

    public UpdatesListCellRenderer(boolean flag) {

        try {
            setCellRenderer(true);
            this.flag = flag;
            BorderLayout bl = new BorderLayout();
            setLayout(bl);

            base_container = new Container(new BoxLayout(BoxLayout.X_AXIS));

            // cnt1.setWidth(width);

            resources = Resources.open("/font.res");

            font = resources.getFont("font1");

            base_container.getStyle().setBgImage(
                    Image.createImage("/images/contact_list_background.png"));

            profile_image.getStyle().setBgTransparency(0);
            profile_image.setPreferredH(60);
            profile_image.setPreferredW(70);
            profile_image.getStyle().setAlignment(CENTER);
            base_container.addComponent(profile_image);

            containerY = new Container(new BoxLayout(BoxLayout.Y_AXIS));

            // name.getStyle().setBgTransparency(0);
            // name.getStyle().setFont(font);

            message.getStyle().setBgTransparency(0);
            message.getStyle().setFont(font);

            containerX = new Container(new BoxLayout(BoxLayout.X_AXIS));
            containerX.getStyle().setAlignment(BOTTOM);
            containerX.getStyle().setMargin(25, 0, 0, 0);

            distance.setAlignment(LEFT);
            distance.setPreferredH(20);
            distance.setPreferredW(85);
            distance.getStyle().setBgImage(
                    Image.createImage("/images/long_right_arrow.png"));
            distance.getStyle().setBgTransparency(0);
            distance.getStyle().setFont(font);

            date.setAlignment(RIGHT);
            date.getStyle().setBgTransparency(0);
            date.getStyle().setFont(font);
            date.getStyle().setMargin(0, 0, 100, 1);


            //moreUpdates.setVisible(false);

            // containerY.addComponent(name);
            containerY.addComponent(message);
            containerX.addComponent(distance);
            containerX.addComponent(date);

            containerY.addComponent(containerX);

            base_container.addComponent(containerY);
            addComponent(BorderLayout.CENTER, base_container);

            //addComponent(BorderLayout.SOUTH, moreUpdates);



            focus.getStyle().setBgTransparency(100);

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    public Component getListCellRendererComponent(List list, Object value,
            int position, boolean isSelected) {
        UpdatesUserData notificationData = (UpdatesUserData) value;

        try {

            //System.out.println(" List get ListComponent Popstion " + position + "  List size  " + list.size());

            //if (!notificationData.message.equals(""))
                message.setText("" + notificationData.message);
//          else
//              message.setText("");

            //if (!notificationData.distance.equals(""))
                distance.setText("" + notificationData.distance);
//          else
//              distance.setText("" + notificationData.distance);

            date.setAlignment(RIGHT);
            //if (!notificationData.date.equals(""))
                date.setText("" + notificationData.date.substring(0, 10));
//          else
//              date.setText("");
            date.setAlignment(RIGHT);

            profile_image.setIcon(Helper.loadImage(notificationData.user_image));

//          if( position == list.size()-1){
//              //base_container.addComponent(moreUpdates);
//              //addComponent(BorderLayout.SOUTH, moreUpdates);
//              moreUpdates.setVisible(true);
//          }




        } catch (IOException e) {
            e.printStackTrace();
        }

        if (isSelected) {
            list.setFocus(true);
            list.getStyle().setBgTransparency(100);
        } else {
            list.setFocus(false);
            list.getStyle().setBgTransparency(0);
        }

        return this;
    }

    public Component getListFocusComponent(List list) {

        return focus;
    }

}

私を助けてください ...

4

4 に答える 4

2

Codename One ブログhttp://codenameone.blogspot.com/2008/07/lwuit-list-renderer-by-chen-fishbein.htmlの Chen の投稿を読む

通常、セル レンダラーはすべての表示項目に対して 1 回呼び出され、移動されると、バックグラウンドでフォーカス移動のアニメーションが実行されるため、さらに呼び出されます。S60 は、半透明の画像では非常に遅くなります。9 ピースのボーダーがある場合は、小さすぎる画像が含まれていないことを確認してください。

パフォーマンスを LWUIT デモと比較して、違いを確認してください。

于 2012-07-15T18:38:03.987 に答える
1

このコードの問題だと思います: profile_image.setIcon(Helper.loadImage(notificationData.user_image));. このコードなしでレンダリングを使用するか、スタブ イメージに置き換えてみてください。どうなるか見てみましょう。

于 2012-07-12T06:01:38.803 に答える
0

わかりました、状態を更新するために何度も印刷されていると思いますList

ListModelに付属の を使用していListますか? この事実は、リストの効率にとって重要です。リストの要素をどのようにマッピングしますか? 質問にコードを貼り付けてもらえますか?

于 2012-07-11T09:13:19.403 に答える
0

リストは、それをペイントするために含まれるすべての要素に対して呼び出されると思います。私の問題は、実際に getListCellRendererComponent() の url から画像をロードするのと同じです。間違って実際にロードする前に (json の解析中に)、保存してからイメージとしてリストに渡します。これにより、リスト リストのパフォーマンスが大幅に向上します。

ところで、皆さん、助けてくれてありがとう..

于 2012-07-16T07:24:57.097 に答える