更新时刷新建议列表 - cn1自动完成

时间:2016-03-27 08:10:35

标签: autocomplete codenameone

我已经在cn1应用中实现了自定义自动填充文字字段,但我发现它只加载了一次建议列表,之后文本中的任何更改都没有触发更改列表,永远不会再调用getSuggestionModel()。我怎样才能实现这个(在我看来,基本的)功能?

这是我的自动完成课程:

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


}

2 个答案:

答案 0 :(得分:0)

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

从技术上讲,你需要做的是返回一个模型,然后改变所说的模型/火灾修改事件,这样一切都会刷新。这非常重要,并且可能无法在所有用例中正常工作,因此理想情况下,我们应该使用更简单的API来实现这一目标。

答案 1 :(得分:0)

在进行了额外的调试之后,我看到required方法仅在初始化期间被调用,并且无论建议列表(在getSuggestionModel()对象中)是什么,它都是如此。相反,我需要操纵底层的suggestion对象:

ListModel