AutoCompleteTextView @ word级别

时间:2014-09-09 01:22:01

标签: android textview autocompletetextview

AutoCompleteTextView提供的建议将取代整个视图内容。是否有View类在单词级别提供此功能?例如,如果我有“所有工作而不是pl”,那么我应该能够建议“播放”,“请”等等,这将完成该单词。如果我选择“播放”它应该变成“所有工作而不是播放”。

2 个答案:

答案 0 :(得分:2)

可以使用MultiAutoCompleteTextView和自定义Tokenizer

我已经从Android的源代码重新调整了CommaTokenizer,以便可以使用任何字符来分割MultiAutoCompleteTextView中的单词。小心,未经测试的代码

public static class CustomTokenizer implements MultiAutoCompleteTextView.Tokenizer {
    private final char WHITE_SPACE = ' ';
    private final char TOKEN_TERMINATING_CHAR;
    private final String TOKEN_TERMINATING_STRING;

    public CustomTokenizer(char tokenTerminatingChar) {
        TOKEN_TERMINATING_CHAR = tokenTerminatingChar;
        if (TOKEN_TERMINATING_CHAR == WHITE_SPACE) {
            TOKEN_TERMINATING_STRING = String.valueOf(TOKEN_TERMINATING_CHAR);
        } else {
            TOKEN_TERMINATING_STRING = String.valueOf(TOKEN_TERMINATING_CHAR) + String.valueOf(WHITE_SPACE);
        }
    }

    @Override
    public int findTokenStart(CharSequence text, int cursor) {
        int i = cursor;

        while (i > 0 && text.charAt(i - 1) != TOKEN_TERMINATING_CHAR) {
            i--;
        }
        while (i < cursor && text.charAt(i) == WHITE_SPACE) {
            i++;
        }

        return i;
    }

    @Override
    public int findTokenEnd(CharSequence text, int cursor) {
        int i = cursor;
        int len = text.length();

        while (i < len) {
            if (text.charAt(i) == TOKEN_TERMINATING_CHAR) {
                return i;
            } else {
                i++;
            }
        }

        return len;
    }

    @Override
    public CharSequence terminateToken(CharSequence text) {
        int i = text.length();

        while (i > 0 && text.charAt(i - 1) == WHITE_SPACE) {
            i--;
        }

        if (i > 0 && text.charAt(i - 1) == TOKEN_TERMINATING_CHAR) {
            return text;
        } else {
            if (text instanceof Spanned) {
                SpannableString sp = new SpannableString(text + TOKEN_TERMINATING_STRING);
                TextUtils.copySpansFrom((Spanned) text, 0, text.length(),
                        Object.class, sp, 0);
                return sp;
            } else {
                return text + TOKEN_TERMINATING_STRING;
            }
        }
    }
}

答案 1 :(得分:1)

我认为您可以通过自定义实现Filterable的Adapter来实现,通过重写方法getFilter()可以返回自定义Filter。

在自定义Filter中,将覆盖名为performFiltering(CharSequence前缀)的方法。 参数前缀是&#34;所有工作,没有pl&#34;在你的例子中,你可以解析它并获得&#34; pl&#34;然后是时候获得匹配单词并返回它们。

在另一个重写方法publishResults(CharSequence约束,FilterResults结果)中,您可以获得建议结果并执行某些操作来刷新UI,像notifyDataSetChanged()一样刷新ListView。

最后,你可以添加&#34;所有的工作,没有&#34;在&#34; play&#34;之前在用户单击时,在AutoCompleteTextView的OnItemClickListener中。

以下是如何在Mithun的回答中定制适配器和过滤器的代码:

Android AutoCompleteTextView with Custom Adapter filtering not working