Search code examples
blackberryblackberry-jde

Checkbox on right side of text in ListField


I want listfield with images and checkbox on right side of text. I got the images on leftside but unable to get checkbox on right side. if possible checkbox should be invisible. only tickmark should be seen. I want to acheive

   Image text1 chechbox 
   Image text2 
   Image text3 checkbox            

images should be same for all listitem.

public final class ListfieldDemo1 extends MainScreen

{

private Vector _listElements;
ListField list;
private ListField _checkList;

public ListfieldDemo1()
{        
    // Set the displayed title of the screen   
    super(Manager.NO_VERTICAL_SCROLL);
    add(new LabelField("Fruits List", LabelField.FIELD_HCENTER));
    add(new SeparatorField());
    setTitle("ListField with images and checkbox");
    _listElements = new Vector();
    add(new SeparatorField());
    list = new ListField();
    ListCallback _callback = new ListCallback(this);
    list.setCallback(_callback);
    list.setSize(4);
    int index = list.getSelectedIndex();

    add(list);

    createField();
}

    protected void createField()
    {
        String itemOne = "Apple";
        String itemTwo = "Blackberry";
        String itemthree ="Grapes";
        String itemfour = "Banana";
        _listElements.addElement(itemOne);

        _listElements.addElement(itemTwo);
        _listElements.addElement(itemthree);
        _listElements.addElement(itemfour);
        reloadList();
    }

    private void reloadList() {

        list.setSize(_listElements.size());
    }
    public boolean invokeAction(int action)
    {
        switch (action)
        {
        case ACTION_INVOKE: // Trackball click.
        return true;
        }
        return super.invokeAction(action);

    }
class ListCallback implements ListFieldCallback
  {
private static final int LEFT_OFFSET = 10;
private static final int TOP_OFFSET = 10;
ListfieldDemo1 listfieldDemo1;

public ListCallback(ListfieldDemo1 listfieldDemo1)
{
        this.listfieldDemo1 = listfieldDemo1;
}

public void drawListRow(ListField listField, Graphics g, int index,
        int y, int w) {

    String text = (String)_listElements.elementAt(index);
    g.drawText(text, 60, y + 5, 0, w);
    text = (String) _listElements.elementAt(index);
    Bitmap bitm = Bitmap.getBitmapResource("bullet_arrow.png");
    int xpos = LEFT_OFFSET;
    int ypos = TOP_OFFSET + y;
    w = bitm.getWidth();
    int h = bitm.getHeight();

    g.drawBitmap(xpos, ypos, w, h, bitm, 0, 0);

    xpos = w + 20;


}

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

}
}

thanks in advance.


Solution

  • I think you want something like the image below:

    List Test With Tick Mark

    Here is the code:

    import java.util.Vector;
    import net.rim.device.api.system.Bitmap;
    import net.rim.device.api.system.Display;
    import net.rim.device.api.ui.Field;
    import net.rim.device.api.ui.Graphics;
    import net.rim.device.api.ui.Manager;
    import net.rim.device.api.ui.MenuItem;
    import net.rim.device.api.ui.UiApplication;
    import net.rim.device.api.ui.component.LabelField;
    import net.rim.device.api.ui.component.ListField;
    import net.rim.device.api.ui.component.ListFieldCallback;
    import net.rim.device.api.ui.component.Menu;
    import net.rim.device.api.ui.component.SeparatorField;
    import net.rim.device.api.ui.container.MainScreen;
    
    public final class ListDemoScreen extends MainScreen {
    
        private Vector _listElements;
    
        ListField list;
        private ListField _checkList;
        private MenuItem _toggleItem;
    
        public ListDemoScreen() {
            super(Manager.NO_VERTICAL_SCROLL);
            // Set the displayed title of the screen
            setTitle("List Demo");
            add(new LabelField("Fruits List", LabelField.FIELD_HCENTER));
            add(new SeparatorField());
    
            _listElements = new Vector();
            add(new SeparatorField());
            list = new ListField();
            ListCallback _callback = new ListCallback(this);
    
            list.setCallback(_callback);
            list.setSize(4);
    
            add(list);
    
            createField();
    
        }
    
        protected void createField() {
            ChecklistData itemOneCheckList = new ChecklistData("Apple", false);
            ChecklistData itemTwoCheckList = new ChecklistData("Blackberry", false);
            ChecklistData itemThreeCheckList = new ChecklistData("Grapes", false);
            ChecklistData itemFourCheckList = new ChecklistData("Banana", false);
    
            _listElements.addElement(itemOneCheckList);
            _listElements.addElement(itemTwoCheckList);
            _listElements.addElement(itemThreeCheckList);
            _listElements.addElement(itemFourCheckList);
            reloadList();
    
        }
    
        private void reloadList() {
            list.setSize(_listElements.size());
        }
    
        public boolean invokeAction(int action) {
            switch (action) {
            case ACTION_INVOKE: // Trackball click.
                int index = list.getSelectedIndex();
                ChecklistData data = (ChecklistData) _listElements.elementAt(index);
                data.toggleChecked();
                _listElements.setElementAt(data, index);
                list.invalidate(index);
                return true; // We've consumed the event.
            }
            return super.invokeAction(action);
    
        }
    
        class ListCallback implements ListFieldCallback {
            ListDemoScreen listDemoScreen;
    
            public ListCallback(ListDemoScreen listDemoScreen) {
                this.listDemoScreen = listDemoScreen;
    
            }
    
            public void drawListRow(ListField list, Graphics g, int index, int y,
                    int w) {
    
                ChecklistData data = (ChecklistData) _listElements.elementAt(index);
    
                Bitmap bitmapImage = null;
                Bitmap bitmapTick = null;
                int widthImage=0;
                int heightImage=list.getRowHeight(index);
                int widthTick=0;
                int heightTick=list.getRowHeight(index);;
                int maxHeight = list.getRowHeight(index);
    
                int xpos=0;
                int ypos=y;
                bitmapImage = Bitmap.getBitmapResource("earth-icon.png");
                bitmapTick = Bitmap.getBitmapResource("ok-icon.png");
                if(bitmapImage != null && bitmapTick != null) {
                    widthImage = bitmapImage.getWidth();
                    widthTick = bitmapTick.getWidth();
                    heightImage = bitmapImage.getHeight();
                    heightTick = bitmapTick.getHeight();
                    maxHeight = (heightTick > heightImage) ? heightTick : heightImage;
    
                    list.setRowHeight(index, maxHeight);
    
                    g.drawBitmap( xpos, ypos+(list.getRowHeight(index)-heightImage)/2, widthImage, heightImage, bitmapImage, 0, 0 );
                    if(data.isChecked()) {
                        g.drawBitmap( getWidth()-widthTick-2, ypos+(list.getRowHeight(index)-heightTick)/2, widthTick, heightTick, bitmapTick, 0, 0 );
                    }
                }
    
                ChecklistData currentRow = (ChecklistData) this.get(list, index);
    
                StringBuffer rowString = new StringBuffer();
    
                rowString.append(currentRow.getStringVal());
                // Draw the text.
                g.drawText(rowString.toString(), xpos + widthImage, y + (list.getRowHeight(index)-getFont().getHeight())/2, 0, -1);
            }
    
            public Object get(ListField list, int index) {
                return _listElements.elementAt(index);
            }
    
            public int indexOfList(ListField list, String prefix, int string) {
                return _listElements.indexOf(prefix, string);
            }
    
            public int getPreferredWidth(ListField list) {
                return Display.getWidth();
            }
    
        }
    
        private class ChecklistData {
            private String _stringVal;
            private boolean _checked;
    
    
            ChecklistData(String stringVal, boolean checked) {
                _stringVal = stringVal;
                _checked = checked;
            }
    
            private String getStringVal() {
                return _stringVal;
            }
    
            private boolean isChecked() {
                return _checked;
            }
    
    
            // Toggle the checked status.
            private void toggleChecked() {
                _checked = !_checked;
            }
    
        }
    
    
        protected void makeMenu(Menu menu, int instance) {
            Field focus = UiApplication.getUiApplication().getActiveScreen()
                    .getLeafFieldWithFocus();
            if (focus == _checkList) {
                menu.add(_toggleItem);
            }
    
            super.makeMenu(menu, instance);
        }
    
    }
    

    Use your own icon for earth-icon.png and ok-icon.png(Tick-Mark).