Question

Everytime I push my new screen with a custom ListField, the rows are not sized as the must be. I try to use invalidate but It doesn't do nothing.

I don't understand why, when I navigate with the focus or when the screen gets inactive and it turns back, the list shows in the proper way.

Bad size

public class AboutListField extends ListField implements ListFieldCallback {

    private Vector rows;

    EncodedImage _rateIcon = EncodedImage
            .getEncodedImageResource("icon_rate.png");
    EncodedImage _privacyIcon = EncodedImage
            .getEncodedImageResource("icon_info.png");
    EncodedImage _legalIcon = EncodedImage
            .getEncodedImageResource("icon_ad.png");
    EncodedImage _facebookIcon = EncodedImage
            .getEncodedImageResource("icon_facebook.png");
    EncodedImage _twitterIcon = EncodedImage
            .getEncodedImageResource("icon_twitter.png");

    private LabelField nameLabel;

    public AboutListField() {
        super(0, ListField.USE_ALL_WIDTH);
        setRowHeight(60);
        setCallback(this);

        Font fontName = Font.getDefault().derive(Font.SERIF_STYLE, 8,
                Ui.UNITS_pt);

        rows = new Vector();

        for (int i = 0; i < 5; i++) {
            HorizontalManager row = new HorizontalManager();
            switch (i) {
            case 0:
                row.add(new BitmapField(_rateIcon.getBitmap()));
                nameLabel = new CustomLabelField("Valorar app", NON_FOCUSABLE,
                        Color.WHITE);
                nameLabel.setFont(fontName);
                row.add(nameLabel);
                break;
            case 1:
                row.add(new BitmapField(_privacyIcon.getBitmap()));
                nameLabel = new CustomLabelField("Política de privacidad",
                        NON_FOCUSABLE, Color.WHITE);
                nameLabel.setFont(fontName);
                row.add(nameLabel);
                break;
            case 2:
                row.add(new BitmapField(_legalIcon.getBitmap()));
                nameLabel = new CustomLabelField("Aviso Legal", NON_FOCUSABLE,
                        Color.WHITE);
                nameLabel.setFont(fontName);
                row.add(nameLabel);
                break;
            case 3:
                row.add(new BitmapField(_facebookIcon.getBitmap()));
                nameLabel = new CustomLabelField("Síguenos en Facebook",
                        NON_FOCUSABLE, Color.WHITE);
                nameLabel.setFont(fontName);
                row.add(nameLabel);
                break;
            case 4:
                row.add(new BitmapField(_twitterIcon.getBitmap()));
                nameLabel = new CustomLabelField("Síguenos en Twitter",
                        NON_FOCUSABLE, Color.WHITE);
                nameLabel.setFont(fontName);
                row.add(nameLabel);
                break;

            default:
                break;
            }
            rows.addElement(row);
        }
        setSize(rows.size());
    }

    protected void drawFocus(Graphics graphics, boolean on) {
        XYRect focusRect = new XYRect();
        getFocusRect(focusRect);

        boolean oldDrawStyleFocus = graphics
                .isDrawingStyleSet(Graphics.DRAWSTYLE_FOCUS);
        try {
            if (on) {
                // set the style so the fields in the row will update its color
                // accordingly
                graphics.setDrawingStyle(Graphics.DRAWSTYLE_FOCUS, true);
                int oldColour = graphics.getColor();
                try {
                    graphics.setColor(Constants.Colors.ORANGE_SELECTED);
                    graphics.fillRect(focusRect.x, focusRect.y,
                            focusRect.width, focusRect.height);
                } finally {
                    graphics.setColor(oldColour);
                }
                // to draw the row again
                drawListRow(this, graphics, getSelectedIndex(), focusRect.y,
                        focusRect.width);
            }

        } finally {
            graphics.setDrawingStyle(Graphics.DRAWSTYLE_FOCUS,
                    oldDrawStyleFocus);
        }
    }

    public void drawListRow(ListField listField, Graphics graphics, int index,
            int y, int width) {
        AboutListField aboutList = (AboutListField) listField;
        HorizontalManager rowManager = (HorizontalManager) aboutList.rows
                .elementAt(index);
        rowManager.drawRow(graphics, 0, y, width, getRowHeight());

    }

    public Object get(ListField listField, int index) {
        // TODO Auto-generated method stub
        return null;
    }

    public int getPreferredWidth(ListField listField) {
        // TODO Auto-generated method stub
        return 0;
    }

    public int indexOfList(ListField listField, String prefix, int start) {
        // TODO Auto-generated method stub
        return 0;
    }

    public boolean navigationClick(int status, int time) {


        switch (this.getSelectedIndex()) {
        case 0:
            //Valorar App

            this.setSelectedIndex(0);
            break;
        case 1:
            // Política de privacidad
            InfosScreen policyScreen = new InfosScreen(InfosScreen.TYPE_PRIVACY);
            UiApplication.getUiApplication().pushScreen(policyScreen);
            this.setSelectedIndex(1);
            break;
        case 2:
            // Aviso Legal
            InfosScreen legalScreen = new InfosScreen(InfosScreen.TYPE_LEGAL);
            UiApplication.getUiApplication().pushScreen(legalScreen);
            this.setSelectedIndex(2);
            break;
        case 3:
            // Facebook
            this.setSelectedIndex(3);
            break;
        case 4:
            // Twitter
            this.setSelectedIndex(4);
            break;
        default:
            break;
        }

        return super.navigationClick(status, time);
    }


    public class HorizontalManager extends Manager {

        public HorizontalManager() {
            super(0);
        }

        public void drawRow(Graphics g, int x, int y, int width, int height) {
            // Arrange the cell fields within this row manager.
            layout(width, height);

            // Place this row manager within its enclosing list.
            setPosition(x, y);

            // Apply a translating/clipping transformation to the graphics
            // context so that this row paints in the right area.
            g.pushRegion(getExtent());

            // Paint this manager's controlled fields.
            subpaint(g);

            g.setColor(0x00CACACA);
            g.drawLine(0, 0, getPreferredWidth(), 0);

            // Restore the graphics context.
            g.popContext();
        }

        protected void sublayout(int width, int height) {
            // set the size and position of each field.
            int fontHeight = Font.getDefault().getHeight();
            int preferredWidth = getPreferredWidth();

            // start with the Bitmap Field of the Radio icon
            Field field = getField(0);
            layoutChild(field, _rateIcon.getWidth(), getRowHeight());
            setPositionChild(field, 20,
                    (getHeight() / 2 - _rateIcon.getHeight() / 2));

            // set the radio name label field
            field = getField(1);
            layoutChild(field, preferredWidth - 16, getRowHeight());
            setPositionChild(field, _rateIcon.getWidth() + 40,
                    (getHeight() / 2 - fontHeight / 2));

            setExtent(preferredWidth, getPreferredHeight());
        }



        // The preferred width of a row is defined by the list renderer.
        public int getPreferredWidth() {
            return Display.getWidth();
        }

        // The preferred height of a row is the "row height" as defined in the
        // enclosing list.
        public int getPreferredHeight() {
            return getRowHeight();
        }
    }

}
Was it helpful?

Solution

I have run into something similar when loading a web bitmap into a list row. Invalidating the row only doesn't seem to work, one has to invalidate the row's parent ListField. So to do this I construct my list row managers with a handle to the parent list.

How are you setting the row's height? When I call my CustomListField's set method, I call super.setRowHeight(CUSTOM_ROW_HEIGHT). That could also solve the problem.

OTHER TIPS

I can't give you details, but this rings a bell with me.

It looks like you've set the row height on the list, but not setting the correct row height on each row.

Try specifically setting the actual height of each row manager, and also telling the list about the correct row height. Make these equal and I think it will work.

If I can find the code this weekend, I'll pop some more info.


Update

Try overriding the height in drawRow() to use your preferred row height. Its the only place I can see you are allowing the system to choose a height for you.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top