2013-03-14 81 views
1

我有一个文本框用于在我的应用程序中搜索产品。当用户在文本框中输入内容时,应该显示建议,以便用户可以搜索任何特定的产品类别。GWT意见箱覆盖默认行为

例如,如果产品被归类为男装,女装,童装,夏季,冬季和用户输入的“磨脚”,建议列表应该显示如下:

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

上KeyUp事件,我清除当前的建议,并通过附加每个类别名称与文本中输入的用户来填充新的建议列表。它可以正常工作,但用户不会输入与类别名称相匹配的任何内容。也就是说,如果用户输入“赢”,建议只显示

Wi in Winter 

但我预计的建议是

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

谁能告诉什么可能是错误的。

谢谢。

更新 - 附代码

其实我创建了一个自定义的widget。下面是我的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> 
+2

您应该发布您迄今为止使用过的代码。这将有助于弄清楚什么是错的。 – enrybo 2013-03-15 03:34:23

+1

发布您的代码。 – 2013-03-15 03:55:09

+1

你必须做productNameString.contains(searchString)。使用productNameString.startsWith(searchString) – Adarsha 2013-03-15 07:14:04

回答

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

}