Автозаполнение непревзойденных результатов - PullRequest
1 голос
/ 26 января 2012

Я пытаюсь выполнить автозаполнение при вводе символов на льду: selectInputText Проблема, с которой я сталкиваюсь, заключается в том, что при вводе символов появляются даже имена, которые не совпадают с набираемыми символами. См. Снимок экрана ниже для справки.

a http://s7.postimage.org/46jk4tka3/autocomplete.png

В идеале автозаполнение должно отображать только первую строку из результата, однако оно отображает строки, которые не соответствуют моим напечатанным символам.

Должен отображаться только Abell Maryland 20606.

Это код, который используется для сравнения, как я могу изменить это в соответствии с моим требованием, которое заключается в отображении только тех результатов, которые соответствуют тому, что я печатаю.

public int compare(Object o1, Object o2) {
        if (o1 instanceof SelectItem) {
            s1 = ((SelectItem) o1).getLabel();
        } else {
            s1 = o1.toString();
        }

        if (o2 instanceof SelectItem) {
            s2 = ((SelectItem) o2).getLabel();
        } else {
            s2 = o2.toString();
        }            
        return s1.compareToIgnoreCase(s2);
    }
};

Я следую этому уроку от Icefaces

http://wiki.icefaces.org/display/ICE/Auto-Complete

Обновление

Мой код в autocomplete.jspx

 <ice:selectInputText rows="10" width="300"
                        listVar="emp"
                        valueChangeListener="#{mybean.updateList}"
                        listValue="#{mybean.list}">
                         <f:facet name="selectInputText">
                   <ice:panelGrid columns="3" columnClasses="empNameCol">
                         <ice:outputText value="#{emp.empName}"/>                         
                   </ice:panelGrid>

метод updateList

public void updateList(ValueChangeEvent event) {

    setMatches(event);

    if (event.getComponent() instanceof SelectInputText) {
        SelectInputText autoComplete = (SelectInputText)event.getComponent();
        if (autoComplete.getSelectedItem() != null) {
            bean = (Bean)autoComplete.getSelectedItem().getValue();
        }            
        else {
            Bean tempCity = getMatch(autoComplete.getValue().toString());
            if (tempCity != null) {
                bean = tempCity;
            }
        }
    }
}

Метод setMatches

private void setMatches(ValueChangeEvent event) {

Object searchWord = event.getNewValue();
int maxMatches = ((SelectInputText)event.getComponent()).getRows();
List matchList = new ArrayList(maxMatches);

try {
    int insert = 
        Collections.binarySearch(dictionary, searchWord, AutoCompleteDictionary.LABEL_COMPARATOR);            
    if (insert < 0) {
        insert = Math.abs(insert) - 1;
    }

    for (int i = 0; i < maxMatches; i++) {                                
        if ((insert + i) >= dictionary.size() || i >= maxMatches) {
            break;
        }
        matchList.add(dictionary.get(insert + i));
    }
} catch (Throwable e) {
    e.printStackTrace();
    logger.error("Erorr finding autocomplete matches" + e.getMessage());
}        
if (this.matchesList != null) {
    this.matchesList.clear();
    this.matchesList = null;
}
this.matchesList = matchList;

}

Обновление 2

Модифицированный метод setMatches

 private void setMatches(ValueChangeEvent event) {
        Object searchWord = event.getNewValue();
        int maxMatches = ((SelectInputText) event.getComponent()).getRows();
        List matchList = new ArrayList(maxMatches);
         try {
             for(int i = 0; i < dictionary.size(); i++) {
                 SelectItem s = (SelectItem)dictionary.get(i);
                 if(s.getLabel().startsWith(searchWord.toString())) {
                     matchList.add(s);
                     if(matchList.size() == maxMatches)
                         break;
                 }   
             }
         } catch (Throwable e) {
             e.printStackTrace();
             logger.error("Erorr finding autocomplete matches" + e.getMessage());
         }        
         if (this.matchesList != null) {
             this.matchesList.clear();
             this.matchesList = null;
         }
         this.matchesList = matchList;
         }

1 Ответ

1 голос
/ 27 января 2012

Вы должны обновить список SelectItems.Вместо того, чтобы просто упорядочить список, вы должны отфильтровать список (или создать новый, содержащий только совпадения).В следующий раз, когда автозаполнение списка будет выполнено, он снова оценит связанный список.

В учебнике icefaces есть несколько прикрепленных источников (внизу).Посмотрите на AutoCompleteBean.Метод updateList(ValueChangeEvent e) вызывает setMatches(e).В рамках этого метода список назначается с новым.

// assign new matchList
if (this.matchesList != null) {
   this.matchesList.clear();
   this.matchesList = null;
}
this.matchesList = matchList;

Это приводит к тому, что компонент пользовательского интерфейса отображает только элементы, которые соответствуют вводу.

Для суммирования : ice:selectInputList всегда будет отображать элементы, содержащиеся в его списке, поэтому уменьшите элементы в списке, чтобы отображать только соответствующие элементы.

С уважением

Обновление

private void setMatches(ValueChangeEvent event) {
Object searchWord = event.getNewValue();
int maxMatches = ((SelectInputText)event.getComponent()).getRows();
List matchList = new ArrayList(maxMatches);

try {
    for(int i = 0; i < dictionary.size(); i++) {
        SelectItem s = dictionary.get(i);
        if(s.getLabel().startsWith(searchWord)) {
            matchList.add(s);
            if(matchList.size() == maxMatches)
                break;
        }   
    }
} catch (Throwable e) {
    e.printStackTrace();
    logger.error("Erorr finding autocomplete matches" + e.getMessage());
}        
if (this.matchesList != null) {
    this.matchesList.clear();
    this.matchesList = null;
}
this.matchesList = matchList;
}

// note: not optimized, just to explain how to do.

Обновление 2 (короткая версия)

/**
 * Fills the suggestionList with the given luceneResult.
 *
 * @param suggestionList                 The list to fill.
 * @param luceneResult                   The previously computed luceneResult.
 */
private static void fillLookupSuggestionList(final List<SelectItem> suggestionList,
    LuceneResult luceneResult)
{
    suggestionList.clear();

    String searchQuery = luceneResult.getLuceneResultConfig().getSearchQuery(); 
    if (luceneResult.getResultSize() <= 0)
    {
        suggestionList.add(new SelectItem(null, BundleHelper.i18n(LuceneLookupController.BUNDLE,
            LuceneLookupController.NO_ITEM_FOUND)));
    }
    else
    {
        List<LuceneResultEntry> results = luceneResult.getResult();
        for (LuceneResultEntry entry : results)
        {
            suggestionList.add(new SelectItem(entry.getMetaInfo(),
                entry.getInfo().getDescription()));
        }
    }
}
...