2010-10-17 10 views
7

Wie erhalten Sie den aktuellen Top-Vorschlag in einem AutoCompleteTextView? Ich habe es vorgeschlagen, Elemente, und ich habe eine Textänderung Listener registriert. Ich habe auch eine Liste auf dem gleichen Bildschirm. Während ich tippe, möchte ich die Liste zu dem aktuellen "besten" Vorschlag scrollen. Aber ich kann mir nicht vorstellen, wie ich auf die aktuellen Vorschläge oder zumindest den besten Vorschlag zugreifen kann. Ich glaube, ich bin auf der Suche nach so etwas wie AutoCompleteTextView.getCurrentSuggestions():Aktuellen Vorschlag von `AutoCompleteTextView` erhalten

autoCompleteTextView.addTextChangedListener(new TextWatcher() { 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 
      String currentText = autoCompleteTextView.getText(); 
      String bestGuess = autoCompleteTextView.getCurrentSuggestions()[0]; 
      //          ^^^ mewthod doesn't exist 
      doSomethingWithGuess(bestGuess); 
     } 
     public void beforeTextChanged(CharSequence s, int start, int count, 
       int after) { 
      // do nothing 
     } 
     public void afterTextChanged(Editable s) { 
      // do nothing 
     } 
    }); 

Antwort

15

Ich habe getan, was Sie mit dem folgenden Code zu tun:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.autocomplete_1); 

    adapter = new ArrayAdapter<String>(this, 
      android.R.layout.simple_dropdown_item_1line, COUNTRIES); 
    AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.edit); 
    textView.setAdapter(adapter); 

    adapter.registerDataSetObserver(new DataSetObserver() { 
     @Override 
     public void onChanged() { 
      super.onChanged(); 
      Log.d(TAG, "dataset changed"); 
      Object item = adapter.getItem(0); 

      Log.d(TAG, "item.toString "+ item.toString()); 
     } 
    }); 
} 

item.toString den Text drucken, die auf dem ersten Element angezeigt wird.

Beachten Sie, dass dies auch dann geschieht, wenn Sie das Popup (Vorschläge) noch nicht anzeigen. Außerdem sollten Sie prüfen, ob Elemente vorhanden sind, die die Filterkriterien (auch Benutzereingaben) erfüllt haben.

das erste Problem zu lösen:

int dropDownAnchor = textView.getDropDownAnchor(); 
    if(dropDownAnchor==0) { 
     Log.d(TAG, "drop down id = 0"); // popup is not displayed 
     return; 
    } 
    //do stuff 

das zweite Problem zu lösen, verwenden getCount> 0

+0

Große Antwort! Viel besser als mein Hack unten. –

+0

Vielen Dank dafür. Ich habe ein paar Tage lang versucht, herauszufinden, wie ich die Höhe meiner Dropdown-Liste anhand der Anzahl der gefilterten Elemente dynamisch ändern kann und nach dem 'afterTextChanged'-Ereignis zu filtern scheint. Der dataSetObserver war genau der Listener, den ich brauchte, um es zu funktionieren – Mike

+0

Dieser ist genau richtig! –

1

AutoCompleteTextView bewegen sich nicht auf die beste Auswahl nach unten, aber engt die Auswahl angezeigt werden. Hier ist ein Beispiel dafür: http://developer.android.com/resources/tutorials/views/hello-autocomplete.html

Wie ich es von AutoCompleteTextView sehe, gibt es keine Möglichkeit, aktuelle Liste von Vorschlägen zu erhalten.

Die einzige Möglichkeit scheint benutzerdefinierte Version von ArrayAdapter zu schreiben und an AutoCompleteTextView.setAdapter (..) übergeben. Hier ist die source to ArrayAdapter. Sie müssen nur eine Methode in innere Klasse ArrayFilter.performFiltering ändern(), so dass es FilterResults aussetzt:

.. hinzufügen Feld innere Klasse ArrayFilter:

public ArrayList<T> lastResults; //add this line 

.. vor dem Ende der Methode performFiltering:

lastResults = (ArrayList<T>) results; // add this line 
    return results; 
} 

es wie folgt (angepasst Beispiel aus link) Verwendung:

AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.autocomplete_country); 
CustomArrayAdapter<String> adapter = new CustomArrayAdapter<String>(this, R.layout.list_item, COUNTRIES); 
textView.setAdapter(adapter); 

// read suggestions 
ArrayList<String> suggestions = adapter.getFilter().lastResult; 
+0

i Code testen, aber in "lastResults = (Arraylist ) Ergebnisse" aber wir können nicht konvertieren ein FilterResults-Typ zu ArrayList . – pengwang

+0

können Sie mir sagen, wie man ändert? sdk2.2 – pengwang

+2

Bitte schauen Sie sich die Antwort oben - es ist eine bessere Lösung als meine;) –

Verwandte Themen