Blackberry中关键字搜索ListField

时间:2011-11-18 11:13:16

标签: blackberry-jde

  

我正在创建一个ListField。在我的每一行中我添加了一个图像和3个labelfield。   任何人都可以告诉我如何为此创建一个keywordfilterField ...   提前致谢   我是黑莓新手。   很少的代码会帮助我很多   这是我创建自定义列表的代码

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

1 个答案:

答案 0 :(得分:1)

KeywordFilterField的问题在于它在内部使用了自己的ListField,所以我认为它很难定制。如果您想按照提供的方式使用它,则必须按如下方式使用它:

    //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());

您必须实现自定义可排序集合来保存您不想显示的项目:

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

        //...
    }

您可以在JDE示例文件夹中找到完整的演示。它被称为keywordfilterdemo。

要使用自己发布的自定义列表,您可能需要对很多内容进行编码,例如自定义EditField以键入接收每个类型字符上的事件的关键字,并链接到分类集合上的搜索(也许您可以使用SortedReadableList),这将在ListField中选择此集合返回的第一个搜索结果。