自定义列表与黑莓图像

时间:2013-10-09 13:34:25

标签: blackberry listfield

我想在我的应用程序中实现类似的功能:enter image description here 也就是说,每个图像包含一个心脏图标。我想在心脏点击处理点击事件,为此我有以下代码

list.setEmptyString("No Image Available", DrawStyle.HCENTER);
            list.setRowHeight(Display.getHeight() - 100);
            list.setSize(data.size());
            if (listVManager != null && listVManager.getFieldCount() > 0) {
                listVManager.deleteAll();
            }

            list.setCallback(new ListFieldCallback() {
                public void drawListRow(ListField list, Graphics graphics,
                        int index, int y, int w) {
                    int yPos = y + list.getRowHeight() - 1;
                    graphics.setColor(0x434343);
                    graphics.fillRect(0, y, w, list.getRowHeight());

                    if (logoThumbnailImage != null
                            && logoThumbnailImage.length > index
                            && logoThumbnailImage[index] != null) {
                        EncodedImage img = logoThumbnailImage[index];
                        graphics.drawImage(0, y + 10, Display.getWidth(),
                                Display.getHeight() - 100, img, 0, 0, 0);

                        graphics.drawText("Hello", 10,
                                Display.getHeight() - 150);
                        graphics.drawImage(Display.getWidth() - 70,
                                Display.getHeight() - 150 + 300,
                                heart.getWidth(), heart.getHeight(), heart,
                                0, 0, 0);
                    } else {
                        graphics.drawImage(
                                15,
                                y + 10,
                                Display.getWidth(),
                                Display.getHeight() - 100,
                                sizeImage(iconImage, Display.getWidth(),
                                        Display.getHeight() - 100), 0, 0, 0);

                    }

                    graphics.drawText("Hello", 10,
                            Display.getHeight() - 150);
                    graphics.drawLine(0, yPos, w, yPos);

                }

                public Object get(ListField listField, int index) {
                    return null;
                }

                public int getPreferredWidth(ListField listField) {
                    return Display.getWidth();
                }

                public int indexOfList(ListField listField, String prefix,
                        int start) {
                    return 0;
                }
            });
            listVManager.add(list);
            loadImages = new LoadImages(80, 80);
            loadImages.start();
        }
    });

这里加载图像是在后台加载图像并将它们存储在logoThumbnailImage数组中的线程,并在加载图像时从那里使列表无效。

加载图像线程类:

private class LoadImages extends Thread {

    int widthL;
    int heightL;
    LoadImages(int width, int height) {
        this.widthL = width;
        this.heightL = height;
    }

    public void run() {
        logoThumbnailImage=new EncodedImage[numberOfItem];
        if (object != null) {
            for (int i = 0; i < numberOfItem; i++) {                
                    try {
                        String text=object[i].getJSONArray("UrlArray").getString(0).toString();
                        EncodedImage encodedImg = JPEGEncodedImage.encode(connectServerForImage(text), quality);    //connectserverForImage load Images from server                     
                        logoThumbnailImage[i] = sizeImage(encodedImg, Display.getWidth(), Display.getHeight()-100);
                        list.invalidate();


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

            }
        } else {
            UiApplication.getUiApplication().invokeLater(new Runnable() {
                public void run() {
                    Dialog.alert("No Data Found");
                }
            });
        }
    }
}

应用程序运行顺利,但我得到以下输出: enter image description here

我有以下问题 1.心脏和描述仅显示在一个列表行中。谁能告诉我我失踪了什么? 2.如何在心脏上执行点击事件

1 个答案:

答案 0 :(得分:3)

仅仅简单地看一下,问题似乎是你在某些地方忽略了传递给drawListRow()方法的'y'位置:

        public void drawListRow(ListField list, Graphics graphics,
                int index, int y, int w) {

有效地,您应该用于绘制当前行(使用int index标识的行)的'画布'受矩形限制 (0,y,w,list.getRowHeight())。

实际上,您实际上可以在属于ListField的范围内绘制任何区域,即您可以绘制到的区域实际上是矩形 (0,0,list.getWidth(),list.getHeight())。 你可以这样做,但你不应该这样做。如果你走到你的行的矩形之外,你将在另一行上画画。

在您的情况下,在所选行之外绘画正是您的代码所做的。你这样做:

                graphics.drawText("Hello", 10,
                        Display.getHeight() - 150);

这实际上位于ListField上,左起10像素,Display.getHeight() - 150从顶部开始。无论您要绘制哪一行,它都将定位在ListField中的此位置。所以每一行都会将Hello文本放在同一个地方。

因此,在编写drawListRow()时,请确保将所有位置偏移以保持在您应该绘制的行的范围内。您正在绘制的区域的原点是(0,y),因此使用y偏移所有垂直位置。不要使用Display.getHeight(),使用list.getRowHeight()让你可以画(为y开始),也不要使用Display.getWidth(高度),使用传递中得到宽度在W变量你可以画画。您的所有图形操作都应在这些范围内发生。

相关问题