2012-04-19 34 views
0

我在黑莓中使用了AutoCompleteField,并使用BasicFilteredList过滤文本。它在Blackberry SDK 5.0及更高版本中运行良好。但是,搜索按照输入的单词进行工作。如果我有一个文本字符串如下。黑莓中的AutoCompleteField文本过滤

ŧ115炫酷Galleria购物中心,CNR老科利尔和沃尔特斯道莫雷WA 1522

它可以过滤字符串只有当我输入152,但它不能过滤如果我使用522我想它应该按照我的要求过滤,因为它们出现在上述搜索字符串中。请帮我解决这个问题。 下面是预先创建AutoCompleteField

import net.rim.device.api.collection.util.BasicFilteredList; 
import net.rim.device.api.collection.util.BasicFilteredListResult; 
import net.rim.device.api.ui.UiApplication; 
import net.rim.device.api.ui.component.AutoCompleteField; 
import net.rim.device.api.ui.component.LabelField; 
import net.rim.device.api.ui.component.ListField; 
import net.rim.device.api.ui.container.MainScreen; 
import net.rim.device.api.ui.text.TextFilter; 
import net.rim.device.api.util.CharacterUtilities; 

public class AutoCompleteFieldApp extends UiApplication { 
    public static void main(String[] args) { 
     AutoCompleteFieldApp app = new AutoCompleteFieldApp(); 
     app.enterEventDispatcher(); 
    } 

    AutoCompleteFieldApp() { 
     pushScreen(new HomeScreen()); 
    } 
} 

class HomeScreen extends MainScreen { 
    LabelField selectedText; 

    public HomeScreen() { 
     setTitle("Autocomplete Text Field Demo"); 

     selectedText = new LabelField(); 

     BasicFilteredList filterList = new BasicFilteredList(); 
     String[] address = { "T 115 Centro Galleria Shopping Centre, Cnr Old Collier and Walters Road Morley WA 1522", 
       "1423 SEAVIEW POINT POINT COOK VIC 2674", 
       "Lot 1498 Yarraman Road Wyndham Vale VIC 3795", 
       "Lot 3506 Witchmount Close Hillside VIC 4055", 
       "6 Paas Place Williamstown VIC 4233", 
       "Lot 99 14 James Close Sunbury VIC 4502", 
       "1 Charlotte Street Clayton South VIC 4779" }; 

     filterList.addDataSet(1, address, "address", BasicFilteredList.COMPARISON_IGNORE_CASE); 
     AutoCompleteField autoCompleteField = new AutoCompleteField(filterList){ 
      public void onSelect(Object selection, int SELECT_TRACKWHEEL_CLICK) { 
       ListField _list = getListField(); 
       if (_list.getSelectedIndex() > -1) { 
        if(selectedText!=null){ 
         BasicFilteredListResult result = (BasicFilteredListResult) selection; 
         selectedText.setText(result._object.toString()); 
        } 
       } 
      } 
     }; 
     add(autoCompleteField); 

     AutoCompleteField autoCompleteField2 = new AutoCompleteField(filterList){ 
      public void onSelect(Object selection, int SELECT_TRACKWHEEL_CLICK) { 
       ListField _list = getListField(); 
       if (_list.getSelectedIndex() > -1) { 
        if(selectedText!=null){ 
         BasicFilteredListResult result = (BasicFilteredListResult) selection; 
         selectedText.setText(result._object.toString()); 
        } 
       } 
      } 
     }; 

     TextFilter filter = new TextFilter() {   
      public char convert(char c, int status) { 
       if (!validate(c)) 
        return 0; 
       return c; 
      } 
      public boolean validate(char c) { 
       return CharacterUtilities.isDigit(c); 
      } 
     }; 

     autoCompleteField2.getEditField().setFilter(filter); 
     add(autoCompleteField2); 
     add(selectedText); 
    } 
} 

由于该代码示例。

回答

0

我没有尝试这个,但我认为这应该工作。在您的BasicFilteredList中首先覆盖getMatchedKeywords。您应该返回将触发匹配的关键字。因此,对于您的情况“1522”您应该返回{“1522”,“522”,“22”,“2”}。来自BasicFilteredListResult的对象应该是您的“1522”。正如你看到的,如果你在可搜索的句子中有几个单词,那么产生所有这些子串会更加痛苦。但这是我认为API的局限性。

可能还有另一种解决方案。

+0

由于我的搜索字符串是巨大的,超过4000+句子..所以这种方法不会工作这种情况。 – 2012-04-19 12:34:29