4

我正在创建一个应用程序,在该应用程序中,我通过 JSON 从 Web 服务器获取带有 ID 的礼物图像。当我点击任何礼物图片时,它会进入下一页,显示该图片的所有信息(通过 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()方法使用了giftsid变量,它是您的类的持久成员变量。您在for循环中分配此变量,因此它保留的最终值是循环中分配的最后一个值 ( giftsidarr.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 回答