0

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

T 115 Centro Galleria Shopping Centre, Cnr Old Collier and Walters Road Morley 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);
    }
}

前もって感謝します。

4

1 に答える 1

0

私はこれを試しませんでしたが、これはうまくいくはずだと思います。の最初getMatchedKeywordsのオーバーライドBasicFilteredList。マッチングをトリガーするキーワードを返す必要があります。したがって、「1522」の場合は、{"1522"、 "522"、 "22"、"2"}を返す必要があります。からのオブジェクトは「1522」BasicFilteredListResultである必要があります。ご覧のとおり、検索可能な文に複数の単語がある場合、これらすべての部分文字列を生成するのはさらに困難になります。しかし、これは私が思うAPIの制限です。

おそらく別の解決策があります。

于 2012-04-19T11:44:16.860 に答える