Java 如何在文本中的其他点显示MultiAutoCompleteTextView下拉列表

Java 如何在文本中的其他点显示MultiAutoCompleteTextView下拉列表,java,android,widget,multiautocompletetextview,Java,Android,Widget,Multiautocompletetextview,我已经实现了MultiAutoCompleteTextView,一切都很好,但是现在我想在用户按下建议单词的第一个字符的任何时候提供建议。基本上,建议出现在文本的开头以及文本中最后一个字符为“,”时 这是我的词汇表: {"/Bag","/Carton","/Kg","/20cm"} 如果用户按下类似于:567/ 我已尝试在自定义类中重写enoughFilter(),如下所示: public static Token

我已经实现了MultiAutoCompleteTextView,一切都很好,但是现在我想在用户按下建议单词的第一个字符的任何时候提供建议。基本上,建议出现在文本的开头以及文本中最后一个字符为“,”时

这是我的词汇表:

{"/Bag","/Carton","/Kg","/20cm"}
如果用户按下类似于:567/

我已尝试在自定义类中重写enoughFilter(),如下所示:

public static Tokenizer mTokenizer = new MultiAutoCompleteTextView.CommaTokenizer();

@Override
    public boolean enoughToFilter() {
        Editable text = getText();
        
        int end = getSelectionEnd();
        if (end < 0 || mTokenizer == null) {
            return false;
        }
        int start = mTokenizer.findTokenStart(text, end);
        if (end - start >= getThreshold() || text.charAt(text.length()-1) == '/') {
            return true;
        } else {
            return false;
        }
    }
public static Tokenizer mTokenizer=new MultiAutoCompleteTextView.CommaTokenizer();
@凌驾
公共布尔值enoughToFilter(){
可编辑文本=getText();
int end=getSelectionEnd();
if(end<0 | | mTokenizer==null){
返回false;
}
int start=mTokenizer.findTokenStart(文本,结束);
if(end-start>=getThreshold()| | text.charAt(text.length()-1)=='/')){
返回true;
}否则{
返回false;
}
}

但这根本不起作用,它会使我的代码崩溃。有人有这个想法吗?

最后,我通过在我的自定义类中重写enoughFilter()performFiltering()replaceText()实现了这一点

因此,对于任何想要实现类似功能的人,请查看下面的代码:

public class MyAutoCompleteEdittext extends MultiAutoCompleteTextView
{
    public static Tokenizer mTokenizer = new MultiAutoCompleteTextView.CommaTokenizer();
    
    public MyAutoCompleteEdittext(Context context){
        super(context);
    }
    public MyAutoCompleteEdittext(Context context, AttributeSet attrs){
        super(context,attrs);
    }
    public MyAutoCompleteEdittext(Context context, AttributeSet attrs,int defStyle ){
        super(context,attrs,defStyle);
    }
    
    @Override
    public boolean enoughToFilter() {
        String subText = getText().toString().substring(0,getSelectionEnd());
        if(subText.contains("/"))
            return true;
        return false;
    }
    
    @Override
    protected void performFiltering(CharSequence text, int start, int end, int keyCode)
    {
        super.performFiltering(text,findTokenStart(text.toString(),end),end,0);
    }
    
    @Override
    protected void replaceText(CharSequence text) {
        clearComposingText();
        Editable editable = getText();
        int end = getSelectionEnd();
        int start = findTokenStart(editable.toString(),end);
        String original = TextUtils.substring(editable, start, end);
        QwertyKeyListener.markAsReplaced(editable, start, end, original);
        editable.replace(start, end, mTokenizer.terminateToken(text));
    }
    
    private int findTokenStart(String allText, int end){
        return allText.substring(0,end).lastIndexOf("/");
    }
    
}

如果需要更多自定义,请检查源代码。这对我帮助很大。

你有车祸报告吗?