Search code examples
blackberrylistfieldrow-height

How to set different row height in listfield with implementing listfieldcallback()?


This is my latest Custom_Listfield class.

public class Custom_ListField extends ListField {
private String[] title, category, date, imagepath;
private int[] newsid, catsid;
private List_News newslist;
private Bitmap imagebitmap[], localimage = Config_GlobalFunction
        .Bitmap("image_base.png");
private BrowserField webpage;
private boolean islatest;
private int highest = 0;

private Vector content = null;
private ListCallback callback = null;

private int currentPosition = 0;

public Custom_ListField(Vector content, boolean islatest) {
    this.content = content;
    this.islatest = islatest;

    newsid = new int[content.size()];
    title = new String[content.size()];
    category = new String[content.size()];
    date = new String[content.size()];
    imagepath = new String[content.size()];
    catsid = new int[content.size()];
    imagebitmap = new Bitmap[content.size()];

    for (int i = 0; i < content.size(); i++) {
        newslist = (List_News) content.elementAt(i);
        newsid[i] = newslist.getID();
        title[i] = newslist.getNtitle();
        category[i] = newslist.getNewCatName();
        date[i] = newslist.getNArticalD();
        imagepath[i] = newslist.getImagePath();
        catsid[i] = newslist.getCatID();

        if (!imagepath[i].toString().equals("no picture")) {
            imagebitmap[i] = Util_ImageLoader.loadImage(imagepath[i]);
            if (imagebitmap[i].getHeight() > highest)
                highest = imagebitmap[i].getHeight();
        } else {
            imagebitmap[i] = localimage;
        }
        catsid[i] = newslist.getCatID();
        if (catsid[0] != 9)
            this.setRowHeight( localimage.getHeight() + 10);
        else
            this.setRowHeight( highest + 10);
    }
    initCallbackListening();
}

private void initCallbackListening() {
    callback = new ListCallback();
    this.setCallback(callback);
}

private class ListCallback implements ListFieldCallback {
    public ListCallback() {
        setBackground(Config_GlobalFunction
                .loadbackground("background.png"));
    }

    public void drawListRow(ListField listField, Graphics graphics,
            int index, int y, int width) {
        currentPosition = index;
        graphics.setColor(Color.WHITE);
        if (catsid[0] != 9) {
            graphics.drawBitmap(
                    Display.getWidth() - localimage.getWidth() - 5,
                    y
                            + ((listField.getRowHeight() - localimage
                                    .getHeight()) / 2),
                    localimage.getWidth(), localimage.getHeight(),
                    imagebitmap[index], 0, 0);
        } else {
            graphics.drawBitmap(
                    Display.getWidth() - imagebitmap[index].getWidth() - 5,
                    y
                            + (listField.getRowHeight() - imagebitmap[index]
                                    .getHeight()) / 2,
                    imagebitmap[index].getWidth(),
                    imagebitmap[index].getHeight(), imagebitmap[index], 0,
                    0);
        }
        graphics.drawRect(0, y, width, listField.getRowHeight());

        graphics.setColor(Color.BLACK);
        Vector text = Config_GlobalFunction.wrap(title[index],
                Display.getWidth() - imagebitmap[index].getWidth() - 10);
        for (int i = 0; i < text.size(); i++) {
            int liney = y + (i * Font.getDefault().getHeight());
            graphics.drawText((String) text.elementAt(i), 5, liney + 3,
                    DrawStyle.TOP | DrawStyle.LEFT | DrawStyle.ELLIPSIS,
                    Display.getWidth() - imagebitmap[index].getWidth() - 10);
        }

        graphics.setColor(Color.GRAY);
        graphics.drawText(date[index], 5, y + Font.getDefault().getHeight()
                * text.size());

        if (islatest) {
            graphics.setColor(Color.RED);
            graphics.drawText(category[index], Font.getDefault()
                    .getAdvance(date[index]) + 15, y
                    + Font.getDefault().getHeight() * text.size());
        }
    }

    public Object get(ListField listField, int index) {
        return content.elementAt(index);
    }

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

    public int indexOfList(ListField listField, String prefix, int start) {
        return content.indexOf(prefix, start);
    }

}

public int getCurrentPosition() {
    return currentPosition;
}

protected boolean navigationClick(int status, int time) {
    final int index = getCurrentPosition();
    Main.getUiApplication().pushScreen(new Custom_LoadingScreen(1));
    Main.getUiApplication().invokeLater(new Runnable() {
        public void run() {
            if (catsid[index] == 9) {
                if (Config_GlobalFunction.isConnected()) {
                    webpage = new BrowserField();

                    MainScreen aboutus = new Menu_Aboutus();
                    aboutus.add(webpage);
                    Main.getUiApplication().pushScreen(aboutus);

                    webpage.requestContent("http://www.orientaldaily.com.my/index.php?option=com_k2&view=item&id="
                            + newsid[index] + ":&Itemid=223");
                } else
                    Config_GlobalFunction.Message(
                            Config_GlobalFunction.nowifi, 1);
            } else
                Main.getUiApplication().pushScreen(
                        new Main_NewsDetail(newsid[index]));
        }
    }, 1 * 1000, false);
    return true;
}
}

I tried set with this.setRowHeight(i, highest + 10);. It return wrong size of height and still every row same height.

I believe there was some tricky part and blackberry does not support for set different row height.


Solution

  • To set dynamic row height, it must call again in listfieldcallback()

    public class Custom_ListField extends ListField {
    private String[] title, category, date, imagepath;
    private int[] newsid, catsid;
    private List_News newslist;
    private Bitmap imagebitmap[], localimage = Config_GlobalFunction
            .Bitmap("image_base.png");
    private BrowserField webpage;
    private boolean islatest;
    
    private Vector content = null, text;
    private ListCallback callback = null;
    
    private int currentPosition = 0;
    
    public Custom_ListField(Vector content, boolean islatest) {
        this.content = content;
        this.islatest = islatest;
    
        newsid = new int[content.size()];
        title = new String[content.size()];
        category = new String[content.size()];
        date = new String[content.size()];
        imagepath = new String[content.size()];
        catsid = new int[content.size()];
        imagebitmap = new Bitmap[content.size()];
    
        for (int i = 0; i < content.size(); i++) {
            newslist = (List_News) content.elementAt(i);
            newsid[i] = newslist.getID();
            title[i] = newslist.getNtitle();
            category[i] = newslist.getNewCatName();
            date[i] = newslist.getNArticalD();
            imagepath[i] = newslist.getImagePath();
            catsid[i] = newslist.getCatID();
    
            if (!imagepath[i].toString().equals("no picture")) {
                imagebitmap[i] = Util_ImageLoader.loadImage(imagepath[i]);
            }
        }
        initCallbackListening();
    }
    
    private void initCallbackListening() {
        callback = new ListCallback();
        this.setCallback(callback);
        this.setRowHeight(-2);
    }
    
    private class ListCallback implements ListFieldCallback {
        public ListCallback() {
    
        }
    
        public void drawListRow(ListField listField, Graphics graphics,
                int index, int y, int width) {
            currentPosition = index;
            setBackground(BackgroundFactory.createBitmapBackground(
                    Bitmap.getBitmapResource("background_news_list.png"),
                    Background.POSITION_X_LEFT, Background.POSITION_Y_TOP,
                    Background.REPEAT_SCALE_TO_FIT));
    
            if (!imagepath[index].toString().equals("no picture")) {
                float ratio = (float) ((float) localimage.getHeight() / (float) imagebitmap[index]
                        .getHeight());
                Bitmap temp = new Bitmap(
                        (int) (imagebitmap[index].getWidth() * ratio),
                        (int) (imagebitmap[index].getHeight() * ratio));
                imagebitmap[index].scaleInto(temp, Bitmap.FILTER_BILINEAR,
                        Bitmap.SCALE_TO_FIT);
                imagebitmap[index] = temp;
    
                graphics.drawBitmap(
                        Display.getWidth()
                                - localimage.getWidth()
                                - 5
                                + ((localimage.getWidth() - imagebitmap[index]
                                        .getWidth()) / 2),
                        y
                                + (listField.getRowHeight(index) - localimage
                                        .getHeight()) / 2,
                        imagebitmap[index].getWidth(),
                        imagebitmap[index].getHeight(), imagebitmap[index], 0,
                        0);
    
                graphics.setColor(Color.BLACK);
                text = Config_GlobalFunction
                        .wrap(title[index], Display.getWidth()
                                - imagebitmap[index].getWidth() - 10);
    
                for (int i = 0; i < text.size(); i++) {
                    int liney = y + (i * Font.getDefault().getHeight());
                    graphics.drawText(
                            (String) text.elementAt(i),
                            5,
                            liney + 3,
                            DrawStyle.TOP | DrawStyle.LEFT | DrawStyle.ELLIPSIS,
                            Display.getWidth() - imagebitmap[index].getWidth()
                                    - 10);
                }
            } else {
                graphics.setColor(Color.BLACK);
                text = Config_GlobalFunction.wrap(title[index],
                        Display.getWidth() - 10);
                for (int i = 0; i < text.size(); i++) {
                    int liney = y + (i * Font.getDefault().getHeight());
                    graphics.drawText(
                            (String) text.elementAt(i),
                            5,
                            liney + 3,
                            DrawStyle.TOP | DrawStyle.LEFT | DrawStyle.ELLIPSIS,
                            Display.getWidth() - 10);
                }
            }
    
            if (text.size() == 2) {
                graphics.setColor(Color.GRAY);
                graphics.drawText(date[index], 5, y
                        + Font.getDefault().getHeight() + 3);
    
                if (islatest) {
                    graphics.setColor(Color.RED);
                    graphics.drawText(category[index], Font.getDefault()
                            .getAdvance(date[index]) + 15, y
                            + Font.getDefault().getHeight() + 3);
                }
            } else if (text.size() == 3) {
                graphics.setColor(Color.GRAY);
                graphics.drawText(date[index], 5, y
                        + Font.getDefault().getHeight() * 2 + 3);
    
                if (islatest) {
                    graphics.setColor(Color.RED);
                    graphics.drawText(category[index], Font.getDefault()
                            .getAdvance(date[index]) + 15, y
                            + Font.getDefault().getHeight() * 2 + 3);
                }
            }
    
            if (!imagepath[index].toString().equals("no picture")) {
                setRowHeight(index, imagebitmap[index].getHeight() + 10);
            } else {
                if (text.size() == 2)
                    setRowHeight(index, getRowHeight() + 9);
                else if (text.size() == 3) {
                    setRowHeight(index, getRowHeight() * 15 / 10 + 9);
                }
            }
    
            graphics.setColor(Color.WHITE);
            graphics.drawRect(0, y, width, listField.getRowHeight(index));
        }
    
        public Object get(ListField listField, int index) {
            return content.elementAt(index);
        }
    
        public int getPreferredWidth(ListField listField) {
            return Display.getWidth();
        }
    
        public int indexOfList(ListField listField, String prefix, int start) {
            return content.indexOf(prefix, start);
        }
    }
    
    public int getCurrentPosition() {
        return currentPosition;
    }
    
    protected boolean navigationClick(int status, int time) {
        final int index = getCurrentPosition();
        Main.getUiApplication().pushScreen(new Custom_LoadingScreen(1));
        Main.getUiApplication().invokeLater(new Runnable() {
            public void run() {
                if (catsid[index] == 9) {
                    if (Config_GlobalFunction.isConnected()) {
                        webpage = new BrowserField();
    
                        MainScreen aboutus = new Menu_Aboutus();
                        aboutus.add(webpage);
                        Main.getUiApplication().pushScreen(aboutus);
    
                        webpage.requestContent("http://www.orientaldaily.com.my/index.php?option=com_k2&view=item&id="
                                + newsid[index] + ":&Itemid=223");
                    } else
                        Config_GlobalFunction.Message(
                                Config_GlobalFunction.nowifi, 1);
                } else
                    Main.getUiApplication().pushScreen(
                            new Main_NewsDetail(newsid[index]));
            }
        }, 1 * 1000, false);
        return true;
    }
    }