1

I am new to blackberry development. I want to add a check-box or tick mark when I click on any list item. When I try to run this is gives a 104 error.

public final class ListDemoScreen extends MainScreen {
    private Vector _listElements;

    private int LEFT_OFFSET = 10;
    private int TOP_OFFSET = 10;
    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 1");
        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);
        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.
            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) {

            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;

            ChecklistData currentRow = (ChecklistData)this.get(list, index);

            StringBuffer rowString = new StringBuffer();

            // If it is checked draw the String prefixed with a checked box,
            // prefix an unchecked box if it is not.
            if (currentRow.isChecked()) {
                rowString.append(Characters.BALLOT_BOX_WITH_CHECK);
            } else {
                rowString.append(Characters.BALLOT_BOX);
            }

            // Append a couple spaces and the row's text.
            rowString.append(Characters.SPACE);
            rowString.append(Characters.SPACE);
            rowString.append(currentRow.getStringVal());

            // Draw the text.
            g.drawText(rowString.toString(), 0, y, 0, w);

        }

        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() { _stringVal = ""; _checked = false; }
         */

        ChecklistData(String stringVal, boolean checked) {
            _stringVal = stringVal;
            _checked = checked;
        }

        // Get/set methods.
        private String getStringVal() {
            return _stringVal;
        }

        private boolean isChecked() {
            return _checked;
        }

        /*
         * private void setStringVal(String stringVal) { _stringVal = stringVal;
         * }
         * 
         * private void setChecked(boolean checked) { _checked = checked; }
         */

        // Toggle the checked status.
        private void toggleChecked() {
            _checked = !_checked;
        }
    }

    /* (non-Javadoc)
     * @see net.rim.device.api.ui.container.MainScreen#makeMenu(net.rim.device.api.ui.component.Menu, int)
     */
    protected void makeMenu(Menu menu, int instance) {

        // TODO Auto-generated method stub
        Field focus = UiApplication.getUiApplication().getActiveScreen().getLeafFieldWithFocus();
        if(focus == _checkList) 
        {
            //The _checkList ListField instance has focus.
            //Add the _toggleItem MenuItem.
            menu.add(_toggleItem);
        }


        super.makeMenu(menu, instance);
    }
}
Gilles 'SO- stop being evil'
  • 104,111
  • 38
  • 209
  • 254
  • refer this link for adding checkbox to an listfield. http://www.blackberry.com/knowledgecenterpublic/livelink.exe/fetch/2000/348583/800332/800505/800345/How_To_-_Create_a_ListField_with_check_boxes.html?nodeid=1165752&vernum=0 – Rince Thomas May 07 '12 at 11:59
  • Could you please take some time in writing your question? It should contain a [**short**, self-contained, correct, example](http://sscce.org/); a _clear_ description of what the problem is and a description of [what you have tried](http://mattgemmell.com/2008/12/08/what-have-you-tried/) when attempting to fix the problem. – Ben May 07 '12 at 12:20

1 Answers1

0

You could have easily found the ClassCastException if you had debugged your code carefully. You added String object in the _listElements Vector in your createField() method, and trying to cast the String objects into a ChecklistData object in the invokeAction(int action) method:

ChecklistData data = (ChecklistData) _listElements.elementAt(index);

You should insert ChecklistData objects in the _listElements vector and after that you obviously can not cast those elements into Strings in the drawListRow() method:

String text = (String) _listElements.elementAt(index);

I've fixed your code, see below (don't know what you wanted to do with the bullet_arrow.png ... so, I've commented out that part after modifying a bit):

import java.util.Vector;
import net.rim.device.api.system.Bitmap;
import net.rim.device.api.system.Characters;
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 1");
        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);
        int index = list.getSelectedIndex();

        add(list);

        createField();

    }

    protected void createField() {
//      String itemOne = "Apple";
//      String itemTwo = "Blackberry";
//      String itemthree = "Grapes";
//      String itemfour = "Banana";
        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 checkListData = (ChecklistData) _listElements.elementAt(index);
            String text = checkListData.getStringVal();
//          g.drawText(text, 60, y + 5, 0, w);
//          Bitmap bitm = null;
//          if(checkListData.isChecked()) {
//              bitm = Bitmap.getBitmapResource("bullet_arrow1.png");
//          } else {
//              bitm = Bitmap.getBitmapResource("bullet_arrow2.png");
//          }

//          w = bitm.getWidth();
//          int h = bitm.getHeight();
//          
//          int xpos = 2;
//          int heightDifference = ( list.getRowHeight(index) - h );
//          int ypos = y + ( heightDifference > -1 ? heightDifference : 0 ) / 2;
//
//          g.drawBitmap( xpos, ypos, w, h, bitm, 0, 0 );

//          xpos = w + 20;

            ChecklistData currentRow = (ChecklistData) this.get(list, index);

            StringBuffer rowString = new StringBuffer();

            // If it is checked draw the String prefixed with a checked box,
            // prefix an unchecked box if it is not.
            if (currentRow.isChecked()) {
                rowString.append(Characters.BALLOT_BOX_WITH_CHECK);
            } else {
                rowString.append(Characters.BALLOT_BOX);
            }

            // Append a couple spaces and the row's text.
            rowString.append(Characters.SPACE);
            rowString.append(Characters.SPACE);
            rowString.append(currentRow.getStringVal());

            // Draw the text.
            g.drawText(rowString.toString(), 0, y, 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() { _stringVal = ""; _checked = false; }
         */

        ChecklistData(String stringVal, boolean checked) {
            _stringVal = stringVal;
            _checked = checked;
        }

        // Get/set methods.
        private String getStringVal() {
            return _stringVal;
        }

        private boolean isChecked() {
            return _checked;
        }


        // Toggle the checked status.
        private void toggleChecked() {
            _checked = !_checked;
        }

    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * net.rim.device.api.ui.container.MainScreen#makeMenu(net.rim.device.api
     * .ui.component.Menu, int)
     */
    protected void makeMenu(Menu menu, int instance) {

        // TODO Auto-generated method stub
        Field focus = UiApplication.getUiApplication().getActiveScreen()
                .getLeafFieldWithFocus();
        if (focus == _checkList) {
            // The _checkList ListField instance has focus.
            // Add the _toggleItem MenuItem.
            menu.add(_toggleItem);
        }

        super.makeMenu(menu, instance);
    }

}

Hope it would be helpful.

Tariq M Nasim
  • 1,278
  • 11
  • 24
  • Thanks man ! It worked. " bullet_arrow.png " is just an images. What i had tried to achive is that "Images Text checkbox " and when i click on list item it should be checked. and and box of tick should not be visisble. only tick mark i want. – Heartbreak-kid May 09 '12 at 06:25
  • I want to achive check list with images and tick mark. like " img" _listElement tickmark. and checkbox box should be invisible only tick mark can be seen. – Heartbreak-kid May 09 '12 at 07:31
  • Given the updated code [here](http://stackoverflow.com/questions/10517065/checkbox-on-right-side-of-text-in-listfield/10522361#10522361) – Tariq M Nasim May 09 '12 at 18:57