【问题标题】:Refresh suggestion list on change - cn1 autocomplete刷新更改建议列表 - cn1 自动完成
【发布时间】:2016-07-14 16:51:00
【问题描述】:

我在 cn1 应用程序中实现了一个自定义自动完成文本字段,但我注意到它只加载建议列表一次,之后文本中的任何更改都不会触发列表中的更改,并且 @ 987654321@ 再也不会被调用。我怎样才能实现这个(在我看来,基本的)功能?

这是我的自动完成课程:

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


}

【问题讨论】:

    标签: autocomplete codenameone


    【解决方案1】:

    这曾经更简单,现在似乎有点问题,如this issues 中所述。

    从技术上讲,您需要做的是返回一个模型,然后改变所述模型/触发修改的事件,以便一切都会刷新。这很重要,并且可能无法在所有用例中正常工作,因此理想情况下,我们应该有一个更简单的 API 来执行此操作。

    【讨论】:

    • 那么我需要在我的实现中添加什么/我需要为此重写哪些方法?
    • 这个问题在issue中讨论过,这是我们需要改进的地方。
    【解决方案2】:

    经过额外的调试,我看到 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));
                }
            }
        }
    
        ...
    
    }
    

    【讨论】:

      猜你喜欢
      • 2013-05-25
      • 1970-01-01
      • 2011-08-24
      • 2015-12-15
      • 2014-02-07
      • 2011-06-13
      • 2014-11-26
      • 2021-12-06
      • 1970-01-01
      相关资源
      最近更新 更多