Dies ist ein Follow-up zu meiner Frage früher hier: Android: Autocomplete TextView Similar To The Facebook App.MultiAutoCompleteTextView mit benutzerdefinierten Adapter zeigt verstümmelte Zeichenfolge
Der Hintergrund:
Meine Forderung in der Frage (Link oben geschrieben) war ein AutoCompleteTextView
ähnlich dem in der Facebook-App und einige andere auch verwendet haben. Die Lösung bestand darin, eine Mehrfachleitung zu verwenden. MultiAutoCompleteTextView
Die Idee war, Benutzern zu ermöglichen, ihre Friends-Namen direkt einzugeben, während sie ein Status-Update erstellen. Die Lösung in der Antwort funktioniert aus einer eigenständigen Sichtweise gut. Als ich jedoch anfing, die Lösung in meinen bestehenden Code zu integrieren, funktioniert sie immer noch mit dem richtigen Drop-down-Menü und allem. Ich sehe die gefilterte Liste meiner Freunde dank einer Lösung von hier: https://stackoverflow.com/a/12363961/1350013. Ich benutze eine benutzerdefinierte ListView
mit einer BaseAdapter
anstelle der GridView
aus der Lösung.
Das Problem:
Mein Code Verwendung eines BaseAdapter
macht die Filterable
implementiert. Wie oben erwähnt, funktioniert gut.
Wenn ich einen Freund aus der gefilterten Liste auswähle, ist das Problem dort. Die MultiAutoCompleteTextView
, nach Auswahl, zeigt dies: @[email protected]
anstelle des Namens des Freundes. Was müsste ich ändern, um den Namen anstelle des verstümmelten Textes zu zeigen? Wenn es hilft, erweitert die Klasse, in der dies ausgeführt wird, eine SherlockActivity
und keine SherlockListActivity
.
Jetzt bin ich nicht sicher, was der relevante Code wäre, um herauszufinden, wo das Problem liegen könnte, also werde ich so viel relevanten Code wie möglich posten. Ich bin ein Noob, also sei bitte einfach und frage nach irgendeinem zusätzlichen Code. Ich werde das umgehend erfüllen. Ebenso, wenn etwas hier nicht benötigt wird, um den Beitrag zu überladen, werde ich das entfernen.
CODE BLOCKS
Die Tokenizer aus der Lösung aus meiner früheren Frage. Linked an der Spitze (im onCreate()
Methode)
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;
}
});
Der TextWatcher, auch aus der Lösung auf die frühere Frage:
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) {
}
};
Für meine 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;
}
}
Ich habe nicht durch den Code der anderen Frage geschaut, aber es scheint, dass die Methode 'toString' für Ihre 'getFriends'-Klasse aufgerufen wird (schreckliche Benennung übrigens).Versuchen Sie, der 'getFriends'-Klasse eine überlagerte' toString'-Methode hinzuzufügen, etwa so: '@Override public String toString() {return friendName;}' und sehen, was passiert. – Luksprog
Zuerst. Die Lösung im Kommentar funktionierte sofort. Also füge das bitte als Antwort hinzu und ich werde es akzeptieren (mit dem Set Bounty) :-). Zweite. Was wäre eine bessere Möglichkeit, die Klasse zu benennen? Wenn du schrecklich sagst, gibt es Bedenken, dass die App nicht funktioniert? Oder ist es nur schlechte Benennungspraxis? –
Ich habe übertrieben mit "schrecklich", es gibt kein Problem mit der App funktioniert ordnungsgemäß, es ist nur, dass Sie die Java-Konventionen (Großbuchstaben für Klassennamen) verwenden sollten. Vielleicht ist die 'getFriends' auch nicht so eine gute Option, zum Beispiel, als ich deine Frage zum ersten Mal gelesen habe, erschien' getFriends' eher als Methodenname und nicht als Klasse. Da es sich bei Ihrer Klasse um einen Datenspeicher handelt, könnte ein Name wie "FriendData" oder "FriendInformation" ein aussagekräftigerer Name für jemanden sein, der Ihren Code liest. Dies ist nicht entscheidend, aber wenn Sie andere Personen lesen, würden Sie ihnen helfen, den Code zu verstehen. – Luksprog