论坛首页 移动开发技术论坛

定制含有CheckBox的ListField (BlackBerry)

浏览 4119 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-01-20  

版权所有,欢迎转载,转载请注明 : SinFrancis  http://mdev.cc

 

BB中是没办法将Checkbox与ListField结合在一起的,不过我们可以自己写个,但也不是真的Checkbox,只是在功能上实现了而已,外观上看着像Checkbox。关键就是在使用 : 

选中状态字符 : Characters.BALLOT_BOX_WITH_CHECK 

非选中字符 :Characters.BALLOT_BOX

 

请看代码:关键地方 drawListRow()

当点击每个Item的时候,判断此行的状态,然后进行选中或者取消,将Characters.BALLOT_BOX_WITH_CHECK 

或者Characters.BALLOT_BOX画上去就Ok 了。

 

 

 

/*
 * CheckBoxListFieldSample.java
 *
 * Research In Motion, 2003-2005
 * Confidential and proprietary.
 */

package cc.mdev.seek;

import net.rim.device.api.ui.*;
import net.rim.device.api.ui.component.*;
import net.rim.device.api.ui.container.*;
import net.rim.device.api.system.*;
import java.util.Vector;

class CheckboxListField extends UiApplication implements ListFieldCallback
{
    private static final String[] _elements = {"First element", "Second element", "Third element", "Fourth element", "Fifth element"};
    private Vector _listData = new Vector();
    private ListField _checkList;
    private MenuItem _toggleItem;
    
    //A class to hold the Strings in the CheckBox and it's checkbox state (checked or unchecked).
    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;
        }
    }
    
  /*  public static void main(String args[])
    {
        CheckboxListField theApp = new CheckboxListField();
        theApp.enterEventDispatcher();
    }*/
    
    CheckboxListField() 
    {    
    
        //The menu item added to the screen when the _checkList field has focus.
        //This menu item toggles the checked/unchecked status of the selected row.
        _toggleItem = new MenuItem("Change Option", 200, 10) 
        {
            public void run()
            {
                //Get the index of the selected row.
                int index = _checkList.getSelectedIndex();
                
                //Get the ChecklistData for this row.
                ChecklistData data = (ChecklistData)_listData.elementAt(index);
                
                //Toggle its status.
                data.toggleChecked();
                
                //Update the Vector with the new ChecklistData.
                _listData.setElementAt(data, index);
                
                //Invalidate the modified row of the ListField.
                _checkList.invalidate(index);
            }
        };    
    
        MainScreen myScreen = new MainScreen()
        {
            //Override the makeMenu method so we can add a custom menu item
            //if the checkbox ListField has focus.
            protected void makeMenu(Menu menu, int instance)
            {
                Field focus = UiApplication.getUiApplication().getActiveScreen().getLeafFieldWithFocus();
                if(focus == _checkList) 
                {
                    //The _checkList ListField instance has focus.
                    //Add the _toggleItem MenuItem.
                    menu.add(_toggleItem);
                }
                
                //Create the default menu.
                super.makeMenu(menu, instance);
            }            
        };
        
        //Add a title to the screen.
        myScreen.setTitle(new LabelField("Checkbox ListField sample"));

        _checkList = new ListField()
        {
            //Allow the space bar to toggle the status of the selected row.
            protected boolean keyChar(char key, int status, int time)
            {
                boolean retVal = false;
                
                //If the spacebar was pressed...
                if (key == Characters.SPACE)
                {
                    //Get the index of the selected row.
                    int index = getSelectedIndex();
                    
                    //Get the ChecklistData for this row.
                    ChecklistData data = (ChecklistData)_listData.elementAt(index);
                    
                    //Toggle its status.
                    data.toggleChecked();
                    
                    //Update the Vector with the new ChecklistData.
                    _listData.setElementAt(data, index);
                    
                    //Invalidate the modified row of the ListField.
                    invalidate(index);
                    
                    //Consume this keyChar (key pressed).
                    retVal = true;
                }
                return retVal;
            }
        };
        
        //Set the ListFieldCallback
        _checkList.setCallback(this);
        
        int elementLength = _elements.length;
        
        //Populate the ListField & Vector with data.
        for(int count = 0; count < elementLength; ++count)
        {
            //Even rows will be checked, odd will be unchecked.
            if (count % 2 == 0)
            {
                _listData.addElement(new ChecklistData(_elements[count], true));
            }
            else
            {
                _listData.addElement(new ChecklistData(_elements[count], false));
            }
            _checkList.insert(count);
        }

        //Add the ListField to the screen.
        myScreen.add(_checkList);
        
        //Push the screen onto the display stack.
        pushScreen(myScreen);
    
    }
    
    //ListFieldCallback impelmentation.
    
    //Draws the list row.
    public void drawListRow(ListField list, Graphics graphics, int index, int y, int w) 
    {
        //Get the ChecklistData for the current row.
        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.
        graphics.drawText(rowString.toString(), 0, y, 0, w);
    }
    
    //Returns the object at the specified index.
    public Object get(ListField list, int index) 
    {
        return _listData.elementAt(index);
    }
    
    //Returns the first occurence of the given String, bbeginning the search at index, 
    //and testing for equality using the equals method.
    public int indexOfList(ListField list, String p, int s) 
    {
        //return listElements.getSelectedIndex();
        return _listData.indexOf(p, s);
    }
    
    //Returns the screen width so the list uses the entire screen width.
    public int getPreferredWidth(ListField list) 
    {
        return Graphics.getScreenWidth();
    }
} 
 

 

论坛首页 移动开发技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics