Blackberry - 具有不同ID的可点击BitmapField

时间:2013-04-17 12:08:47

标签: blackberry

我正在创建一个应用程序,通过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();
        }
    }
}

2 个答案:

答案 0 :(得分: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()有许多不同值的循环中声明 giftsid方法,但navigationClick()方法使用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

答案 1 :(得分: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 
                        }
                    }
                }
            }
        };
相关问题