如何与执行listfieldcallback()设置不同的行高listfield? [英] How to set different row height in listfield with implementing listfieldcallback()?

查看:218
本文介绍了如何与执行listfieldcallback()设置不同的行高listfield?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我最新的 Custom_Listfield 类。

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;
}
}

我试着设定 this.setRowHeight(I,最高+ 10); 。它返回的高度尺寸不对,仍然每一行相同的高度。

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.

推荐答案

要设置动态的行高,它必须再次在调用listfieldcallback()

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;
}
}

这篇关于如何与执行listfieldcallback()设置不同的行高listfield?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆