2016-03-27 3 views
1

私はcn1アプリケーションでカスタムオートコンプリートテキストフィールドを実装しましたが、テキスト内の変更がリスト内で変更され、getSuggestionModel()は決して再び呼び出されません。この(私の心で、基本的な)機能をどのように達成できますか?変更候補リストを更新する - cn1オートコンプリート

これは私のオートコンプリートクラスです:

public class ForumNamesAutocomplete extends AutoCompleteTextField { 
    List<String>suggestions = new LinkedList<String>(); 
    List<Map<String,Object>> fData; 
    StateMachine mac; 
    int currentIndex; 
    String prevText; 
    public static final String KEY_FORUM_NAME = "name"; 
    public static final String KEY_FORUM_ID = "id"; 
    public static final String KEY_FORUM_DESC = "desc"; 

    public ForumNamesAutocomplete(StateMachine sm){ 
     super(); 
     mac = sm; 
     if(sm.forumData != null){ 
      fData = mac.forumData; 
     } 
    } 

    @Override 
    protected boolean filter(String text) { 
     if(text.equals(prevText)){ 
      return false; 
     } 
     setSuggestionList(text); 
     fireDataChanged(DataChangedListener.CHANGED, text.length()); 
     prevText = text; 
     return true; 
    } 

    @Override 
    public void fireDataChanged(int type, int index) { 
     super.fireDataChanged(type, index); 
    } 



    public void setSuggestionList(String s){ 
     if(suggestions == null){ 
      suggestions = new LinkedList<String>(); 
     }else{ 
      suggestions.clear(); 
     } 
     LinkedList<String> descList = new LinkedList<String>(); 
     for(int i = 0;i<fData.size();i++){ 
      boolean used = false; 
      Map<String,Object> forumMap = fData.get(i); 
      if(((String)forumMap.get(KEY_FORUM_NAME)).indexOf(s) != -1){ 
       suggestions.add((String)forumMap.get(KEY_FORUM_NAME)); 
       used = true; 
      } 
      if(!used && ((String)forumMap.get(KEY_FORUM_DESC)).indexOf(s) != -1){ 
       descList.add((String)forumMap.get(KEY_FORUM_NAME)); 
      } 
     } 
     suggestions.addAll(descList); 
    } 



    @Override 
    protected ListModel<String> getSuggestionModel() { 
      return new DefaultListModel<String>(suggestions); 
    } 


} 

答えて

0

追加のデバッグ後、getSuggestionModel()メソッドが初期化中にのみ呼び出されていたことがわかりました。その時点で提案リスト(suggestionオブジェクト内)が何であっても、それはそのままでした。代わりに、私は、基礎となるListModelオブジェクトを操作するために必要な:

public class ForumNamesAutocomplete extends AutoCompleteTextField { 
    ListModel<String>myModel = new ListModel<String>(); 
    ... 

    @Override 
    protected boolean filter(String text) { 
     if(text.length() > 1){ 
      return false; 
     } 
     setSuggestionList(text); 
     return true; 
    } 

    private void setSuggestionList(String s){ 
     if(myModel == null){ 
      myModel = new ListModel<String>(); 
     }else{ 
      while(myModel.getSize() > 0) 
       myModel.removeItem(0); 
     } 
     for(int i = 0;i<fData.size();i++){ 
      boolean used = false; 
      Map<String,Object> forumMap = fData.get(i); 
      if(((String)forumMap.get(KEY_FORUM_NAME)).indexOf(s) != -1){ 
       myModel.addItem((String)forumMap.get(KEY_FORUM_NAME)); 
       used = true; 
      } 
      if(!used && ((String)forumMap.get(KEY_FORUM_DESC)).indexOf(s) != -1){ 
       myModel.addItem((String)forumMap.get(KEY_FORUM_NAME)); 
      } 
     } 
    } 

    ... 

} 
0

これは、簡単かつthis issuesで説明したように、今少し問題があると思われることに使用されます。

技術的には、1つのモデルを返してから、モデル/火災修正イベントを変更してすべてが更新されるようにする必要があります。これは自明ではなく、すべてのユースケースで正しく機能しない可能性がありますので、私たちが前進するにつれてこれを行うためのより簡単なAPIを用意するのが理想的です。

+0

だから私は、私はそれのためにオーバーライドする必要がない方法で、私の実装/に追加する必要が何をすべきか? – ygesher

+0

これは問題で議論されていますが、これは改善する必要があるものです。 –

関連する問題