2012-10-10 22 views
6

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

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

+0

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? –

+1

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

Antwort

6

Gemessen an den Ausgabe Sie erhalten es scheint, dass Ihr Code ruft die toString Methode auf Ihre getClass Objekte, um die Daten abrufen, die es benötigt. Wie Sie die den Namen des Freundes wollen, sollten Sie Ihre eigenen toString Methode implementieren (durch Überschreiben) wie folgt aus:

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

Dies ist nicht, wie es getan werden sollte (und ich würde sogar sagen, dass es falsch ist), gibt es bestimmte Methoden für diese Konvertierung. Sie sollten sich nicht auf die Funktionen toString-Methode verlassen. – Heinrisch

14

Sie sollten convertResultToString(Object resultValue) in Ihrem Filter außer Kraft setzen, in dem Objekt der Klasse ist. Dadurch ist es möglich, eine benutzerdefinierte Zeichenfolge für Ihre Klasse zu erstellen, ohne die Methode to String zu überschreiben.

+2

sollte dies die akzeptierte Antwort sein. Es funktioniert besser mit der Internationalisierung, da Sie den Anwendungskontext in Ihrem Modellobjekt nicht benötigen. – alaeri

Verwandte Themen