6

这是我之前的问题的后续行动:Android: Autocomplete TextView Similar to The Facebook App

的背景:

我在问题中的要求(上面发布的链接)是AutoCompleteTextView与 Facebook 应用程序和其他几个应用程序中使用的类似。解决方案是使用多行MultiAutoCompleteTextView该想法是使用户能够在创建状态更新时直接键入他们的朋友姓名。从独立的角度来看,答案中的解决方案可以正常工作。但是,当我开始将解决方案集成到现有代码中时,它仍然适用于正确的下拉菜单等。多亏了这里的解决方案,我看到了我朋友的过滤列表:https ://stackoverflow.com/a/12363961/1350013 。我使用ListView带有 aBaseAdapter而不是GridView来自解决方案的自定义。

问题:

我的代码使用了BaseAdapterwhich implements Filterable。如上所述,工作正常。

当我从过滤列表中选择一个朋友时,问题就出在哪里。选择MultiAutoCompleteTextView后,将显示:@MY_PACKAGE_NAME.Friends.getFriends@406c1058而不是朋友的名字。我必须更改什么才能显示名称而不是乱码?如果有帮助,我在扩展 aSherlockActivity而不是 a中运行它的类SherlockListActivity

现在我不确定相关代码是什么来找出问题所在,所以我会发布尽可能多的相关代码。我是菜鸟,所以请放轻松并要求提供任何其他代码。我会及时遵守。同样,如果这里不需要的东西弄乱了帖子,我会删除它。

代码块

我之前的问题的解决方案中的 Tokenizer。链接在顶部(在onCreate()方法中)

editStatusUpdate = (MultiAutoCompleteTextView) findViewById(R.id.editStatusUpdate);
editStatusUpdate.addTextChangedListener(filterTextWatcher);

editStatusUpdate.setTokenizer(new Tokenizer() {

    @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.toString() + " ";
            }
        }
    }

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

        int i = cursor;

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

        if (i < 1 || text.charAt(i - 1) != '@') {
            return cursor;
        }

        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;

    }
});

TextWatcher,同样来自前面问题的解决方案:

private TextWatcher filterTextWatcher = new TextWatcher() {

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {

        Layout layout = editStatusUpdate.getLayout();
        int pos = editStatusUpdate.getSelectionStart();
        int line = layout.getLineForOffset(pos);
        int baseline = layout.getLineBaseline(line);

        int bottom = editStatusUpdate.getHeight();

        editStatusUpdate.setDropDownVerticalOffset(baseline - bottom);

    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count,
            int after) {

    }

    @Override
    public void afterTextChanged(Editable s) {

    }
};

对于我的 ArrayList:

public class getFriends {

    String friendID;
    String friendName;
    String friendProfile;

    boolean selected;

    // SET FRIENDS ID
    public void setFriendID(String friendID) {
        this.friendID = friendID;
    }

    // GET FRIENDS ID
    public String getFriendID() {
        return friendID;
    }

    // SET FRIENDS NAME
    public void setFriendName(String friendName) {
        this.friendName = friendName;
    }

    // GET FRIENDS NAME
    public String getFriendName() {
        return friendName;
    }

    // SET FRIENDS PROFILE
    public void setFriendProfile(String friendProfile) {
        this.friendProfile = friendProfile;
    }

    // GET FRIENDS PROFILE
    public String getFriendProfile() {
        return friendProfile;
    }
}
4

2 回答 2

14

您应该在过滤器中覆盖convertResultToString(Object resultValue),其中 Object 是您的类。这使得为​​您的类创建自定义字符串而不依赖于覆盖 to String 方法成为可能。

于 2012-10-21T12:11:17.367 回答
6

从您得到的输出来看,您的代码似乎调用了对象toString上的方法getClass来检索它需要的数据。当你想要朋友的名字时,你应该toString像这样实现你自己的方法(通过覆盖它):

@Override
public String toString() {
    return friendName; 
}
于 2012-10-20T16:37:33.743 回答