2012-10-10 4 views
6

これは前の質問に従います。Android: Autocomplete TextView Similar To The Facebook Appカスタムアダプタを使用したMultiAutoCompleteTextViewに文字化けした文字列が表示されます

背景:問題の

私の要件は、(リンクは上記の投稿)あまりにもFacebookアプリや他のいくつかで使用されているものと同様AutoCompleteTextViewを持っていることでした。解決策は複数行を使用することでしたMultiAutoCompleteTextView考え方は、ユーザーがステータス更新を作成している間にフレンド名を直接入力できるようにすることでした。回答のソリューションは、スタンドアロンの観点からうまく機能します。しかし、私が既存のコードでソリューションを統合したのを見つけたとき、それは正しいドロップダウンといっしょに動作します。ここからの解決策のおかげで、私の友人のフィルタリングされたリストが表示されます:https://stackoverflow.com/a/12363961/1350013。私は、溶液からGridViewの代わりにBaseAdapterのカスタムListViewを使用します。

問題:

私のコードはFilterableを実装BaseAdapterを使用しています。上記のように、うまく動作します。

フィルタリングされたリストから友達を選択すると、どこに問題があるのですか? MultiAutoCompleteTextViewは、選択後、友人の名前ではなく@[email protected]と表示されます。文字化けしたテキストの代わりに名前を表示するには、何を変更する必要がありますか?助けがあれば、クラスIは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にリンクされ、また、以前の質問への溶液から:私のArrayListの場合

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) { 

    } 
}; 

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; 
    } 
} 
+0

私は他の質問のコードを見ていませんが、 'toString'メソッドがあなたの' getFriends'クラス(途方もない命名法)のために呼び出されているようです。オーバーライドされた 'toString'メソッドを' getFriends'クラスに追加しようとします。 '@Override public String toString(){return friendName;}'と何が起こるかを見てください。 – Luksprog

+0

まずは。このコメントの解決策はすぐに働きました。ですから、これを回答として追加してください。私はそれを受け入れます(設定された賞金で):-)。二番目。クラスに名前を付けるより良い方法は何でしょうか?あなたは恐ろしいと言うとき、それはアプリケーションの不具合に対する懸念を提起するのだろうか?それとも悪い命名法ですか? –

+1

私は "恐ろしい"を使って誇張してしまいました。アプリが正しく機能することに問題はありません。それはJavaの規約(クラス名の大文字)を使うべきことだけです。また、 'getFriends'はあまり良い選択肢ではないかもしれません。たとえば、あなたの質問を最初に読んだとき、' getFriends'はメソッド名のように見え、クラスではないようです。あなたのクラスはデータ所有者で、 'FriendData'や' FriendInformation'のような名前は、あなたのコードを読んでいる人にとってより表現力のある名前でした。これは重要なことではありませんが、他の人がそれを読んでいる場合は、コードを理解するのに役立ちます。 – Luksprog

答えて

6

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

@Override 
public String toString() { 
    return friendName; 
} 
+1

これはどのように行うべきではありません(私はそれが間違っていると言うでしょう)、この変換のための指定されたメソッドがあります。関数toStringメソッドに頼るべきではありません。 – Heinrisch

14

をあなたは、オブジェクトがあなたのクラスである、あなたのフィルターでconvertResultToString(Object resultValue)をオーバーライドする必要があります。これにより、toStringメソッドをオーバーライドすることなく、クラスのカスタム文字列を作成することができます。

+2

これは受け入れられる回答である必要があります。これは、モデルオブジェクトのアプリケーションコンテキストを取得する必要がないため、国際化の方が効果的です。 – alaeri

関連する問題