2012-10-12 4 views
6

In meiner Anwendung habe ich ein linkes Fenster, das eine Listenansicht enthält. Die in dieser Listenansicht getroffene Auswahl ruft dann die relevanten Daten auf, die den rechten Fensterbereich und andere Links und Elemente in der Aktivität aktualisieren. Aufgrund dieses Entwurfs muss im linken Bereich immer eine Auswahl getroffen werden, um dem Rest der Aktivität nützliche Werte zu geben.Android: Einstellen eines programmatisch angeklickten Listenansichtsobjekts auf den ausgewählten Status

In der OnCreate-Methode meiner Aktivität rufe ich Folgendes auf, um standardmäßig das erste Element in der Liste auszuwählen. (Program ist mein Listview)

programList.performItemClick(programList, 0, programList.getItemIdAtPosition(0); 

Das alles funktioniert super und die Aussicht Lasten wie mit den richtigen Werten erwartet, mit einer Ausnahme.

Ich habe einen auswählbaren Selektor für die Listenansicht hinzugefügt, der das ausgewählte Element hervorhebt. Wenn das Element physisch im Emulator angeklickt wird, wird es hervorgehoben (ich verwende CHOICE_MODE_SINGLE), aber es wird beim Aufruf von performItemClick() nicht hervorgehoben. Ich habe nach Hilfe für stackoverflow gesucht und versucht, das Folgende vor dem Klick zu verwenden, aber es hat keinen Unterschied gemacht.

programList.requestFocusFromTouch(); 
    programList.setSelection(0); 

Von der API lesen die setSelection Methode klingt nicht den Zustand des Elements unter einem Touch-Interface ist gesetzt, und von meinen Ergebnissen scheint es, dass die performItemClick Methode auch nicht der Fall ist. Ich habe auch versucht

programList.getAdapter().getView(0, null, null).setSelected(true); 

verwenden Dann kann ich den Zustand der Textansicht lesen und sehen, dass es ausgewählt ist, aber das auch tat nichts zu ändern, was auf dem Bildschirm angezeigt wird.

Gibt es etwas in der onCreateMethod, das verhindert, dass der Status der Schaltfläche anders gezeichnet wird? Ich habe versucht, das Zeichen in der einzelnen Textansicht ungültig zu machen und die Textansicht selbst ungültig zu machen, aber das hat nicht geholfen. Ich habe auch versucht, den Hintergrund der Textansicht zu ändern, aber es scheint, dass der Selektor, den ich gesetzt habe, das steuert oder davor gezeichnet wird. Ich weiß, dass ich die richtige textView habe, weil ich getText benutzt habe, um zu lesen, was drin ist.

Wenn jemand mir bei diesem Problem helfen oder auf eine Lösung hindeuten kann, wäre das sehr zu schätzen.

Antwort

4

Der Trick besteht darin, die getView() Methode des Adapters zu überschreiben. Versuchen Sie folgendes:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    final View renderer = super.getView(position, convertView, parent); 
    if (position == index_of_selected_item) { 
     renderer.setBackgroundResource(android.R.color.darker_gray); 
    } 
    return renderer; 
} 

Natürlich können Sie die Hintergrundfarbe setzen, was Farbe Sie möchten, um anzuzeigen, dass es die „aktive“ Element ist.

+0

Danke. Gibt es eine Möglichkeit, dies mit der listview.setSelector() -Methode zu erledigen, oder muss ich den Rest meiner Zustände mit getView() einstellen? Der setSelector ist viel praktischer, da es nur eine XML-Ressource ist. Ich wünschte, ich wüsste, was anders passiert, wenn ich mit meiner Maus in den Emulator klicke, im Gegensatz zu dem, was passiert, wenn ich das Klickereignis programmatisch aufruft. – ndw

+0

Dadurch kann ich das Objekt nie abwählen, auch wenn ich Ihrer Aussage etwas anderes hinzufüge und auf die andere Farbe setze. Get view wird erst beim Laden der Ansicht aufgerufen. Sobald der Hintergrund für dieses Listenansichtselement festgelegt wurde, bleibt es so. [this] (http://stackoverflow.com/questions/10296846/android-listview-select-first-item-after-loading-datas) hat mich am nächsten gebracht, aber seine Erklärung ist unvollständig. – ndw

+2

Wie kann ich index_of_selected_item Wert erhalten – Dimitri

Verwandte Themen