Ja, Aus Sicht des iOS-Entwickler, finde ich, dass es extrem schwierig ist, Funktionen anwenden wie „Satz Standardauswahl, wenn Start“ und „erinnern Auswahlstatus nach Benutzer Zeile geklickt“ zu Listview.
Lassen Sie uns also mit beginnen „erinnern Auswahl“ first.The Problem ist, dass selbst wenn Sie wissen, dass Sie Selektor xml verwenden können highlight/gedrückt/Fokus style.but diesem Stil zu definieren, wird nicht nach Benutzer gehalten werden Diese Zeile wurde angeklickt.Zum Beispiel habe ich eine Hervorhebung Wähler xml (list_selector.xml unter res/ziehbar Ordner) wie folgt aus (aber Sie können auch andere Felder haben müssen wie die Textfarbe von Textview in Reihe markieren):
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/list_selector_pressed" android:state_pressed="true" />
<item android:drawable="@drawable/list_selector_pressed" android:state_selected="true" />
</selector>
und list_selector_pressed. xml, die die Hervorhebung Stil definiert - die Hintergrundfarbe zu einer grauen Farbe:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/dark_gray" />
</shape>
</item>
</layer-list>
so wie @ David Hedlund vorgeschlagen:
Vielmehr weisen Sie einen OnItem ClickListener und speichert die ID des ausgewählten Elements in einer Variablen.
benötigen Sie eine Instanz-Variable auf Ihre Klasse zu erstellen:
private View currentSelectedView;
gehen dann zu
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
if (currentSelectedView != null && currentSelectedView != v) {
unhighlightCurrentRow(currentSelectedView);
}
currentSelectedView = v;
highlightCurrentRow(currentSelectedView);
//other codes
}
Ganz einfach: wir überprüfen, ob currentSelectedView null oder aktuelle geklickt Ansicht ist oder nicht. Wir heben zuerst jeden Stil auf, indem wir die Methode unhighlightCurrentRow aufrufen (currentSelectedView) --- Sie fragen sich vielleicht, warum wir die momentane Variable currentSelectedView als Parameter übergeben, ich werde es später erklären. Dann weisen wir currentSelectedView eine Ansicht zu und markieren die aktuelle Zeile; damit der Stil beibehalten wird, nachdem der Benutzer geklickt hat.
private void unhighlightCurrentRow(View rowView) {
rowView.setBackgroundColor(Color.TRANSPARENT);
TextView textView = (TextView) rowView.findViewById(R.id.menuTitle);
textView.setTextColor(getResources().getColor(R.color.white));
}
private void highlightCurrentRow(View rowView) {
rowView.setBackgroundColor(getResources().getColor(
R.color.dark_gray));
TextView textView = (TextView) rowView.findViewById(R.id.menuTitle);
textView.setTextColor(getResources().getColor(R.color.yellow));
}
Aha, das ist es. So implementieren wir "remember selection" für die Listenansicht. Wie Sie sehen, müssen wir die Codes duplizieren sowohl in XML und Java-Code Styling - ziemlich dumm :(
Weiter über „set Standardauswahl“ Sie mögen denken, dass Sie dies tun können
.
listView.setAdapter(adatper)
listView.setSelection(0);
currentSelectedView = listView.getChildAt(0);
highlightCurrentRow(currentSelectedView);
in onCreate() in der Aktivität oder onActivityCreated() in Fragmente.
Aber wenn Sie es ausführen, werden Sie Nullpointer Ausnahme und warum? bekommen zu diesem Zeitpunkt, da wird die Listenansicht noch nicht gerendert und Android nicht wie iOS, die ViewWillAppear haben, SO müssen Sie eine Instant-Variable erstellen, um zu erinnern, ob es ist
So unter currentSelectedView Erklärung:
private Boolean firstTimeStartup = true;
fügen Sie dann Methoden: zum ersten Mal Listview-Zelle und in onListItemClick unscharf zu schalten diese Variable zu machen nehmen wir die erste Zeile in der Listenansicht hervorheben möchten:
public class HomeAdapter extends ArrayAdapter<String> {
int layoutResourceId;
public HomeAdapter(Context context, int textViewResourceId,
ArrayList<String> objects) {
super(context, textViewResourceId, objects);
layoutResourceId = textViewResourceId;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(
layoutResourceId, null);
}
if (firstTimeStartup && postion == 0) {
highlightCurrentRow(convertView);
} else {
unhighlightCurrentRow(convertView);
}
TextView title = (TextView) convertView
.findViewById(R.id.menuTitle);
title.setText(getItem(position));
return convertView;
}
}
Ziemlich einfach. Aber Sie müssen einige Änderungen in onListItemClick Methode machen:
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
if (firstTimeStartup) {// first time highlight first row
currentSelectedView = l.getChildAt(0);
}
firstTimeStartup = false;
if (currentSelectedView != null && currentSelectedView != v) {
unhighlightCurrentRow(currentSelectedView);
}
currentSelectedView = v;
highlightCurrentRow(currentSelectedView);
//other codes
}
Dort gehen Sie! Enjoy Android :)
Ich habe bereits versucht, setSelection() zu verwenden, wenn Sie zurückkommen, aber es ist nicht gut - zuerst wird die Zeile überhaupt nicht hervorgehoben (keine Hintergrundfarbe), und zweitens befindet sich die Zeile am oberen Rand des Bildschirms obwohl Es war irgendwo in der Mitte, als ich ging. Danke. – WhiteTigerK
Eine andere Sache - in der Kontaktliste des Geräts, wenn Sie den Trackball verwenden, um einen Kontakt auszuwählen und dann den Trackball drücken, um seine Details anzuzeigen, wird der Status der Kontaktliste gespeichert, so dass der Kontakt immer noch ausgewählt ist Der Standort auf dem Bildschirm ist derselbe. Daher gehe ich davon aus, dass dieses Verhalten erreicht werden kann. Danke. – WhiteTigerK
Ja, der Auswahlstatus wird gespeichert, aber wenn Sie den Bildschirm berühren, wird der * Berührungsmodus * umgeschaltet. Im Berührungsmodus gibt es, wie Sie bereits bemerkt haben, keine visuelle Rückmeldung für einen ausgewählten Gegenstand. nur kurzes Feedback, wenn der Gegenstand berührt wird, was nicht passiert, wenn Sie zur Listenansicht zurückkehren). Dies ist das Standardverhalten. ändere es nicht. –