6

これは、以前の私の質問へのフォローアップです: Android: Autocomplete TextView Similar To The Facebook App

背景:

質問 (上記のリンク) での私の要件はAutoCompleteTextView、Facebook アプリや他のいくつかで使用されているものと同様のものを用意することでした。解決策は、複数行を使用することMultiAutoCompleteTextViewでした。アイデアは、ユーザーがステータス更新を作成するときに、フレンドの名前を直接入力できるようにすることでした。回答のソリューションは、スタンドアロンの観点からは正常に機能します。ただし、ソリューションを既存のコードに統合し始めたとき、正しいドロップダウンなどで引き続き機能します。https://stackoverflow.com/a/12363961/1350013のソリューションのおかげで、フィルター処理された友達のリストが表示されます。ソリューションの の代わりにを使用してカスタムを使用しListViewます。BaseAdapterGridView

問題:

私のコードは、BaseAdapterを実装するを利用していますFilterable。上記のとおり、問題なく動作します。

フィルタリングされたリストからフレンドを選択すると、問題が発生します。を選択すると、フレンドの名前の代わりに次のようMultiAutoCompleteTextViewに表示されます。@MY_PACKAGE_NAME.Friends.getFriends@406c1058文字化けしたテキストの代わりに名前を表示するには、何を変更する必要がありますか? それが役立つ場合、これを実行するクラスは、 ではSherlockActivityなくを拡張しSherlockListActivityます。

問題がどこにあるのかを突き止めるための関連コードが何であるかわからないので、できるだけ多くの関連コードを投稿します。私は初心者なので、簡単に追加のコードを求めてください。速やかに対応いたします。同様に、ここで不要なものが投稿を乱雑にしている場合は、それを削除します。

コードブロック

私の以前の質問からのソリューションのトークナイザー。上部にリンク(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)オブジェクトがクラスであるフィルターでオーバーライドする必要があります。これにより、to String メソッドのオーバーライドに依存せずに、クラスのカスタム文字列を作成できます。

于 2012-10-21T12:11:17.367 に答える
6

取得した出力から判断すると、コードがオブジェクトのtoStringメソッドを呼び出して、必要なデータを取得しているように見えます。getClass友達の名前が必要な場合は、次のように独自のtoStringメソッドを (オーバーライドして)実装する必要があります。

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