1

アプリケーションで製品を検索するためのテキストボックスがあります。ユーザーがテキストボックスに何かを入力すると、ユーザーが特定の製品カテゴリで検索できるように提案が表示されます。

たとえば、商品がメンズ、ウィメンズ、キッズ、サマー、ウィンターに分類され、ユーザーが「フットウェア」と入力した場合、提案リストには次のように表示されます。

foot wear in Men
foot wear in Women
foot wear in Kids
foot wear in Summer
foot wear in Winter

KeyUp イベントで、現在の提案をクリアし、ユーザーが入力したテキストを各カテゴリ名に追加して、新しい提案リストを作成します。ユーザーがカテゴリ名と一致するものを何も入力しない限り、正常に機能します。つまり、ユーザーが「Win」と入力した場合、提案はのみ表示されます

Wi in Winter

しかし、私は提案が

Win in Men
Win in Women
Win in Kids
Win in Summer
Win in Winter

何が間違っているのか誰にもわかりますか。

ありがとう。

更新 - コードを添付

実際にカスタムウィジェットを作成しました。以下は私のJavaおよびxmlテンプレートです

public class MySearchBox extends Composite implements IsWidget, HasKeyDownHandlers, HasSelectionHandlers<Suggestion>, KeyUpHandler, ClickHandler, BlurHandler
{

private static MySearchBoxUiBinder uiBinder = GWT.create(MySearchBoxUiBinder.class);

interface MySearchBoxUiBinder extends UiBinder<Widget, MySearchBox>
{
}

private static final List<String> PDT_CHANNELS = Arrays.asList("Men", "Women", "Kids", "Summer", "Winter");

@UiField
SuggestBox mySuggestionBox;

public MySearchBox()
{
    initWidget(uiBinder.createAndBindUi(this));
    initialize();
}

private void initialize()
{

    mySuggestionBox.getTextBox().addKeyUpHandler(this);
    mySuggestionBox.getTextBox().addClickHandler(this);
    mySuggestionBox.getTextBox().addBlurHandler(this);

}

@Override
public void onKeyUp(final KeyUpEvent event)
{
    if(event.getNativeKeyCode() != KeyCodes.KEY_ENTER)
    {
        populateOracle(mySuggestionBox.getText().trim());
    }
}

private void populateOracle(final String inputText)
{

    String searchText = "";
    if(inputText != null)
    {
        searchText = inputText.trim();
    }
    if((searchText == null || searchText.length() < 1))
    {
        clearOracle();
        mySuggestionBox.showSuggestionList();
        return;
    }
    final List<String> oracleSuggestions = new ArrayList<String>();
    for(String scope : PDT_CHANNELS)
    {
        oracleSuggestions.add(searchText + " in " + scope);
    }
    populateOracle(oracleSuggestions);

}

private void clearOracle()
{
    final MultiWordSuggestOracle oracle = (MultiWordSuggestOracle)mySuggestionBox.getSuggestOracle();
    final DefaultSuggestionDisplay suggestionDisplay = (DefaultSuggestionDisplay)mySuggestionBox
            .getSuggestionDisplay();
    if(suggestionDisplay.isSuggestionListShowing())
    {
        suggestionDisplay.hideSuggestions();
    }
    oracle.clear();
}

private void populateOracle(final List<String> data)
{
    final MultiWordSuggestOracle oracle = (MultiWordSuggestOracle)mySuggestionBox.getSuggestOracle();
    oracle.clear();
    oracle.addAll(data);
    final DefaultSuggestionDisplay suggestionDisplay = (DefaultSuggestionDisplay)mySuggestionBox
            .getSuggestionDisplay();
    if(!suggestionDisplay.isSuggestionListShowing())
    {
        mySuggestionBox.showSuggestionList();
    }
}

@Override
public HandlerRegistration addSelectionHandler(final SelectionHandler<Suggestion> handler)
{
    return mySuggestionBox.addHandler(handler, SelectionEvent.getType());
}

@Override
public HandlerRegistration addKeyDownHandler(final KeyDownHandler handler)
{
    return mySuggestionBox.addHandler(handler, KeyDownEvent.getType());
}
}

XML テンプレート:

</ui:style>
    <g:SuggestBox ui:field="mySuggestionBox"></g:SuggestBox>
</ui:UiBinder> 
4

1 に答える 1

0

コードで何が問題だったのかを特定しました。clearOracle(); を呼び出して候補リストをクリアしました。そして、新しい提案を追加します。出来た。みんな、ありがとう。

private void populateOracle(final String inputText)
{

    String searchText = "";
    if(inputText != null)
    {
        searchText = inputText.trim();
    }
    clearOracle();
    if((searchText == null || searchText.length() < 1))
    {

        mySuggestionBox.showSuggestionList();
        return;
    }
    final List<String> oracleSuggestions = new ArrayList<String>();
    for(String scope : PDT_CHANNELS)
    {
        oracleSuggestions.add(searchText + " in " + scope);
    }
    populateOracle(oracleSuggestions);

}
于 2013-03-17T23:51:56.130 に答える