0

我想像这样制作自定义 AutoCompleteView ..

在此处输入图像描述

添加我的特殊字符时应该填充它(如 facebook .. 当您键入 @B 时,所有以“B”开头的朋友都将被填充,我们可以选择名称)。

在添加“@”之前,不应在键入时填充它。

当添加“@”时,自动完成视图被下拉,我们可以选择名称,选择后将被附加。

在此处输入图像描述

我发现了这一点,但并不满意。我需要线索。他们已经实现了......就像你输入'@'下拉填充时一样。但我必须自定义更多。现在,如果其他人有想法或任何未完成的来源,我需要帮助。

我必须自己尝试,但在实施 customview 之前让我问一下以节省我的时间。

4

2 回答 2

2

您必须通过扩展类来制作自定义自动完成视图。并且您的问题中提到的代码将被更改。

public class CustomAutoComplete extends AutoCompleteTextView {
private String previous = "";
private String seperator = "@";
boolean isState = false;

public CustomAutoComplete(final Context context, final AttributeSet attrs,
        final int defStyle) {
    super(context, attrs, defStyle);
    this.setThreshold(1);

}

public CustomAutoComplete(final Context context, final AttributeSet attrs) {
    super(context, attrs);
    this.setThreshold(1);
}

public CustomAutoComplete(final Context context) {
    super(context);
    this.setThreshold(1);
}

/**
 * This method filters out the existing text till the separator and launched
 * the filtering process again
 */
@Override
protected void performFiltering(final CharSequence text, final int keyCode) {
    String filterText = text.toString().trim();
    String lastchar = filterText.substring(filterText.length() - 1,
            filterText.length());
    if (filterText.length() == 1) {
        if (lastchar.equals(seperator)) {
            isState = true;
        } else {
            isState = false;
        }
    }
    previous = filterText.substring(0,
            filterText.lastIndexOf(getSeperator()) + 1);

    filterText = filterText.substring(filterText
            .lastIndexOf(getSeperator()) + 1);

    if ((lastchar.equals(seperator)) || isState) {
        super.performFiltering(filterText, keyCode);

        isState = true;

    }
}

/**
 * After a selection, capture the new value and append to the existing text
 */
@Override
protected void replaceText(final CharSequence text) {
    isState = false;
    super.replaceText(previous + text);// + getSeperator());

}

public String getSeperator() {
    return seperator;
}

public void setSeperator(final String seperator) {
    this.seperator = seperator;
}

}

希望对你有帮助...

于 2013-03-06T12:20:17.010 回答
0

您可以使用MultiAutoCompleteTextView. 只需实现您自己的Tokenizer类,它就可以工作。对于提及我已经写了一个类,你可以使用它。

package howdysam.com.howdysuggesttext;

import android.text.SpannableString;
import android.text.Spanned;
import android.text.TextUtils;
import android.widget.MultiAutoCompleteTextView;


public class AtTokenizer implements MultiAutoCompleteTextView.Tokenizer {

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

        while (i > 0 && text.charAt(i - 1) != '@') {
            i--;
        }
        while (i < cursor && text.charAt(i) == '@') {
            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) == '@') {
                return i;
            } else {
                i++;
            }
        }

        return len;
    }

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

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

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

然后在视图部分(活动或片段)而不是做

 edit.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer());

做以下

edit.setTokenizer(new AtTokenizer());

有用。

于 2015-08-04T17:18:42.243 回答