Search code examples
blackberry-jde

Keyword Search for ListField in Blackberry


I am creating a ListField. in each row of I am adding a image and 3 labelfield. Can any one tell me how to create a keywordfilterField for this... Thanks in advance I am new to blackberry. Little code will help me alot This is my code for creating a custom list

class CustomListField extends ListField implements ListFieldCallback
{
String type;
int DISPLAY_WIDTH = Display.getWidth();
int DISPLAY_HEIGHT = Display.getHeight();
Vector mItems = new Vector();
Vector mine = new Vector();
Vector three= new Vector();     
// SizedVFM mListManager = new SizedVFM(DISPLAY_WIDTH, DISPLAY_HEIGHT - 40);
Bitmap searchresult = Bitmap.getBitmapResource("res/searchresult.png");
HorizontalFieldManager hfManager;
Bitmap image ,image1;
int z = this.getRowHeight();
CustomListField(String text1,String text2,String type) 
{
    for (int i = 1; i < 31; i++) 
    {      
        mItems.addElement(text1 +String.valueOf(i));
        mine.addElement("    "+text2);
        three.addElement("31");
    }
    this.type=type;
    this.setRowHeight((2*z));       
    this.setCallback(this);
    this.setSize(20);
    //mListManager.add(mListField);
    //add(mListManager);           
}
public void drawListRow(ListField field, Graphics g, int i, int y, int w) 
{
    // Draw the text.
    image = Bitmap.getBitmapResource("res/searchresult.png");
    String text = (String) get(field, i);
    String mytext = (String)mine.elementAt(i);
    String urtext=(String)three.elementAt(i);
    g.drawBitmap(0, y, image.getWidth(),image.getHeight(), image, 0, 0);
    g.drawText(text, image.getWidth(), y, 0, w);
    g.setColor(Color.GRAY);
    g.drawText(mytext, image.getWidth(), y+getFont().getHeight(), 0, w);
    g.drawText(urtext,Graphics.getScreenWidth()*7/8,y,0,w);
    if (i != 0) 
    {
          g.drawLine(0, y, w, y);
    }       
}

public Object get(ListField listField, int index) 
{
    return mItems.elementAt(index);
}

public int getPreferredWidth(ListField listField) 
{
    return DISPLAY_WIDTH;
}

public int indexOfList(ListField listField, String prefix, int start) 
{
    return 0;
}
protected boolean touchEvent(TouchEvent message) 
{
    // If click, process Field changed
    if ( message.getEvent() == TouchEvent.CLICK ) 
    {
        if(type.equals("Stops"))
            UiApplication.getUiApplication().pushScreen(new SearchScreen("Services")); 
        else if(type.equals("Services"))
            UiApplication.getUiApplication().pushScreen(new SearchScreen("Stops")); 
        return true;
    }
    return super.touchEvent(message);
}
}   

Solution

  • The problem with KeywordFilterField is that it uses internally its own ListField, so I think it is going to be difficult to customize. If you wanted to use it as it is provided, you'll have to use it as follows:

        //KeywordFilterField contains a ListField to display and a search edit field to type in the words
        KeywordFilterField keywordFilterField = new KeywordFilterField();  
    
        //Instantiate the sorted collection:
        CustomList cl = new CustomList(mItems);
    
        //Pass the custom collection
        keywordFilterField.setSourceList(cl, cl); 
    
    
        //Now you have to add two fields: first the list itself
        myManager.add(keywordFilterField);
        //And the search field, probably you'd want it at top: 
        myScreen.setTitle(keywordFilterField.getKeywordField());
    

    You'll have to implement a custom sortable collection to hold the items you wan't to display:

        class CustomList extends SortedReadableList implements KeywordProvider {
            //In constructor, call super constructor with a comparator of <yourClass>
            public CustomList(Vector elements)
            {
                super(new <yourClass>Comparator());  //pass comparator to sort
                loadFrom(elements.elements());      
            } 
    
            //Interface implementation
            public String[] getKeywords( Object element )
            {        
                if(element instanceof <yourClass> )
                {            
                    return StringUtilities.stringToWords(element.toString());
                }        
                return null;
            }  
    
            void addElement(Object element)
            {
                doAdd(element);        
            }
    
            //...
        }
    

    You have a full demo available inside the JDE samples folder. It is called keywordfilterdemo.

    To use a custom list like the one you posted, you'll probably have to code a lot of stuff, like a custom EditField to type in the keywords receiving events on every typed character, linked to a search on a sortered collection (maybe you could use a SortedReadableList for this) which will select in your ListField the first search result returned by this collection.