4

JSONを介してWebサーバーからID付きのギフト画像を取得する1つのアプリケーションを作成しています。ギフト画像をクリックすると、次のページに移動し、その画像のすべての情報が表示されます (JSON を介して Web サーバーから ID を使用して画像情報を取得します)。

問題は次のとおりです。ページ上のギフト画像をクリックして関連情報を表示すると、毎回最後のギフト画像 ID が取得されます。任意の画像をクリックすると、クリックした特定の画像 ID が取得されます。それはどのように可能ですか??

ページのスクリーンショット: http://ugo.offroadstudios.com/gifts.png

サンプルコードは次のとおりです。

public class Gifts extends MainScreen {

    String giftsid;
    BitmapField giftimg;

    public Gifts(){
        setTitle("Gift Store");
        creategifts();
    }

    public void creategifts()
    {
        //Link URL
        String strURL = "http://ugo.offroadstudios.com/api/frndgift/?loginusername=adil;deviceside=true";
        webConnection wb = new webConnection();
        String res = wb.getJson(strURL);

        try {
            JSONObject object = new JSONObject(res);
            if(object.getString("status") == "error")
            {
                Dialog.alert("Invalid "+object.getString("status"));
            }
            else
            {
                int totalgifts;
                totalgifts = object.getInt("totalgifts");
                Bitmap listThumb;
                JSONArray imagearr;
                JSONArray giftsidarr;
                String imgname;
                Bitmap bmpResized;

                for(int i=0;  i < totalgifts; i++){
                    imagearr = object.getJSONArray("gifts_image");
                    imgname = imagearr.getString(i);
                    giftsidarr = object.getJSONArray("gifts_id");
                    giftsid = giftsidarr.getString(i);

                    listThumb = getImage.getImageFromUrl("http://ugo.offroadstudios.com/wp-content/plugins/bp-gifts-rebirth/includes/images/"+imgname+";deviceside=true");
                    bmpResized = GPATools.ResizeTransparentBitmap(listThumb, 80, 80,
                    Bitmap.FILTER_LANCZOS, Bitmap.SCALE_TO_FIT);

                    giftimg =new BitmapField(bmpResized,FOCUSABLE)
                    {
                        protected boolean navigationClick(int status, int time)
                        {
                            Dialog.alert("giftsid "+giftsid);
                            UiApplication.getUiApplication().pushScreen(new SendGift(giftsid));
                            return true;
                        }
                    };
                    add(giftimg);
                }
            }

        }
        catch (JSONException e) {
            System.out.println("EX is "+e);
            e.printStackTrace();
        }
    }
}
4

2 に答える 2

1

次のコードでボタンを作成したため、リストの最後のギフトのギフト ID を常に取得しています。

giftimg =new BitmapField(bmpResized,FOCUSABLE)
{
    protected boolean navigationClick(int status, int time)
    {
        Dialog.alert("giftsid "+giftsid);
        UiApplication.getUiApplication().pushScreen(new SendGift(giftsid));
        return true;
    }
};

メソッドは、クラスの永続メンバー変数navigationClick()である変数を使用しました。ループ内でこの変数を割り当てるため、保持される最終値は、ループ内で最後に割り当てられた値になります ( )。 giftsidforgiftsidarr.getString(totalgifts)

多くの異なる値が存在するループ内でメソッドを宣言しますが、メソッドは実行時の値を使用します。最後の値。navigationClick()giftsidnavigationClick()giftsid

それを修正する方法はたくさんあります。ループで別の定数値を使用できます。

final String nextGiftsId = giftsid;

giftimg =new BitmapField(bmpResized,FOCUSABLE)
{
    protected boolean navigationClick(int status, int time)
    {
        Dialog.alert("nextGiftsId= "+nextGiftsId);
        UiApplication.getUiApplication().pushScreen(new SendGift(nextGiftsId));
        return true;
    }
};

または、Signare が提案したように、対応するギフトを識別するCookieを各ボタンに添付します。

giftimg =new BitmapField(bmpResized,FOCUSABLE)
{
    protected boolean navigationClick(int status, int time)
    {
        String giftId = (String)getCookie();   // read gift id from the cookie
        Dialog.alert("giftId= "+giftId);
        UiApplication.getUiApplication().pushScreen(new SendGift(giftId));
        return true;
    }
};
giftimg.setCookie(giftsid);  // set the cookie after creating the field
于 2013-04-18T00:53:14.660 に答える
0

for ループ内に、次のコードを追加します -

giftimg[i].setChangeListener(this);

それで -

public void fieldChanged(Field field, int context) {
for(int i=0;i<totalgifts;i++) {
    if(field == giftimg[i]) {
        // you can trigger your event 
    }
}

編集 :-

giftimg[i].setChangeListener(listener);

listener = new FieldChangeListener() {
            public void fieldChanged(Field field, int context) {
                if ( field instanceof BitmapField ) {
                    for(int i=0;i<totalgifts;i++) {
                        if ( field == giftimg[i] ) {
                           // you can trigger your event 
                        }
                    }
                }
            }
        };
于 2013-04-17T12:25:07.720 に答える