2012-04-19 1 views
0

AutoCompleteFieldをブラックベリーに使用し、BasicFilteredListを使用してテキストをフィルタリングしました。 Blackberry SDK 5.0以降で正常に動作します。しかし、検索は入力された単語に従って動作しています。私は以下のようなテキスト文字列がある場合。Blackberryのオートコンプリートフィールドのテキストフィルタリング

T 115セントロガレリアショッピングセンター、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+文以上です。 –

関連する問題