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

Autocomplete 刷新更改建议列表-cn1自动完成,autocomplete,codenameone,Autocomplete,Codenameone,我在cn1应用程序中实现了一个自定义的自动完成文本字段,但我注意到它只加载一次建议列表,之后文本中的任何更改都不会触发列表中的更改,并且不再调用getSuggestionModel()。我如何实现这个(在我看来是基本的)功能 这是我的自动完成课程: public class ForumNamesAutocomplete extends AutoCompleteTextField { List<String>suggestions = new LinkedList<Str

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


}
公共类ForumNamesAutocomplete扩展了AutoCompleteTextField{
Listsuggestions=新建LinkedList();
列出fData;
状态机mac;
int-currentIndex;
字符串前置文本;
公共静态最终字符串键\u论坛\u NAME=“NAME”;
公共静态最终字符串键\u FORUM\u ID=“ID”;
公共静态最终字符串键\u论坛\u DESC=“DESC”;
公共ForumNamesAutocomplete(状态机sm){
超级();
mac=sm;
if(sm.forumData!=null){
fData=mac.forumData;
}
}
@凌驾
受保护的布尔筛选器(字符串文本){
if(text.equals(prevText)){
返回false;
}
设置建议列表(文本);
fireDataChanged(DataChangedListener.CHANGED,text.length());
prevText=文本;
返回true;
}
@凌驾
public void fireDataChanged(int类型,int索引){
super.fireDataChanged(类型、索引);
}
public void setSuggestionList(字符串s){
if(建议==null){
建议=新建LinkedList();
}否则{
建议。清晰();
}
LinkedList descList=新建LinkedList();

对于(inti=0;i这过去比较简单,现在似乎有点问题,如中所述


从技术上讲,您需要做的是返回一个模型,然后对所说的模型/触发修改事件进行变异,以便所有事件都将刷新。这是非常重要的,并且可能不适用于所有用例,因此理想情况下,我们应该有一个更简单的API来执行此操作。

正如前面所解释的,这过去更简单,现在似乎有点问题在


从技术上讲,您需要做的是返回一个模型,然后对所说的模型/激发修改的事件进行变异,以便所有事件都将刷新。这不是一件小事,可能无法正确地用于所有用例,因此理想情况下,我们应该有一个更简单的API来执行此操作。

经过额外的调试后,我看到
getSuggestionModel()
方法仅在初始化期间被调用,无论此时的建议列表(在
建议
对象中)是什么,它仍然是这样。相反,我需要操作底层的
列表模型
对象:

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

    ...

}
公共类ForumNamesAutocomplete扩展了AutoCompleteTextField{
ListModelmyModel=新ListModel();
...
@凌驾
受保护的布尔筛选器(字符串文本){
if(text.length()>1){
返回false;
}
设置建议列表(文本);
返回true;
}
私有void setSuggestionList(字符串s){
if(myModel==null){
myModel=新的ListModel();
}否则{
while(myModel.getSize()>0)
myModel.removietem(0);
}

对于(int i=0;i在额外调试之后,我看到
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));
            }
        }
    }

    ...

}
公共类ForumNamesAutocomplete扩展了AutoCompleteTextField{
ListModelmyModel=新ListModel();
...
@凌驾
受保护的布尔筛选器(字符串文本){
if(text.length()>1){
返回false;
}
设置建议列表(文本);
返回true;
}
私有void setSuggestionList(字符串s){
if(myModel==null){
myModel=新的ListModel();
}否则{
while(myModel.getSize()>0)
myModel.removietem(0);
}

对于(int i=0;iSo)我需要向我的实现中添加什么/我需要为此重写哪些方法?这在本期中讨论,这是我们需要改进的地方。那么我需要向我的实现中添加什么/我需要为此重写哪些方法?这在本期中讨论,这是我们需要改进的地方。