これは前の質問に従います。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;
}
}
私は他の質問のコードを見ていませんが、 'toString'メソッドがあなたの' getFriends'クラス(途方もない命名法)のために呼び出されているようです。オーバーライドされた 'toString'メソッドを' getFriends'クラスに追加しようとします。 '@Override public String toString(){return friendName;}'と何が起こるかを見てください。 – Luksprog
まずは。このコメントの解決策はすぐに働きました。ですから、これを回答として追加してください。私はそれを受け入れます(設定された賞金で):-)。二番目。クラスに名前を付けるより良い方法は何でしょうか?あなたは恐ろしいと言うとき、それはアプリケーションの不具合に対する懸念を提起するのだろうか?それとも悪い命名法ですか? –
私は "恐ろしい"を使って誇張してしまいました。アプリが正しく機能することに問題はありません。それはJavaの規約(クラス名の大文字)を使うべきことだけです。また、 'getFriends'はあまり良い選択肢ではないかもしれません。たとえば、あなたの質問を最初に読んだとき、' getFriends'はメソッド名のように見え、クラスではないようです。あなたのクラスはデータ所有者で、 'FriendData'や' FriendInformation'のような名前は、あなたのコードを読んでいる人にとってより表現力のある名前でした。これは重要なことではありませんが、他の人がそれを読んでいる場合は、コードを理解するのに役立ちます。 – Luksprog