Ich habe eine Liste von Alben (mehrere Hundert) .. Wenn ich das ausgewählte Album anfasse, möchte ich dem Benutzer die Wahl bieten, das gesamte Album abzuspielen oder zu seinem Track ListView zu wechseln. Kein Problem ... Nach dem Berühren des Ablums in albumListView möchte ich jedoch, dass die Zeile hervorgehoben bleibt, sodass der Benutzer weiß, welches Element er angeklickt hat, und kann dann zu OK oder PLAY wechseln. Wie markiere ich eine Zeile in ListView?
Zitiert aus http://Android-developers.blogspot.de/2008/12/touch-mode.html
Stellen Sie sich eine einfache Anwendung vor, beispielsweise ApiDemos, die eine Liste von Textelementen anzeigt. Der Benutzer kann mit dem Trackball frei durch die Liste navigieren, alternativ kann er jedoch auch über den Touchscreen gescrollt werden. Das Problem in diesem Szenario besteht darin, wie mit der Auswahl ordnungsgemäß umgegangen wird, wenn der Benutzer die Liste über den Touchscreen bearbeitet.
Wenn in diesem Fall der Benutzer ein Element oben in der Liste auswählt und dann die Liste nach unten bewegt, was soll mit der Auswahl passieren? Soll es auf dem Objekt bleiben und vom Bildschirm rollen? Was soll passieren, wenn der Benutzer sich dafür entscheidet, die Auswahl mit dem Trackball zu verschieben? Oder was noch schlimmer ist, was passiert, wenn der Benutzer den Trackball drückt, um auf das aktuell ausgewählte Element zu reagieren, das nicht mehr auf dem Bildschirm angezeigt wird?
Nach sorgfältiger Überlegung entschieden wir uns, die Auswahl vollständig zu entfernen, wenn der Benutzer die Benutzeroberfläche über den Touchscreen bearbeitet.
Im Touch-Modus gibt es keinen Fokus und keine Auswahl. Jedes ausgewählte Element in einer Liste in einem Raster wird deaktiviert, sobald der Benutzer den Berührungsmodus aktiviert. Auf ähnliche Weise werden alle fokussierten Widgets unscharf, wenn der Benutzer den Berührungsmodus wechselt. Das Bild unten zeigt, was passiert, wenn der Benutzer eine Liste berührt, nachdem er einen Gegenstand mit dem Trackball ausgewählt hat.
Andere Lösung (meistens in XML)
1) Setze die choiceMode
der ListView
auf singleChoice
<ListView
Android:choiceMode="singleChoice"
.../>
2) Elemente der Liste müssen eine überprüfbare Ansicht sein und eine Farbstatusliste als Hintergrund verwenden
zB: album_item.xml
<?xml version="1.0" encoding="utf-8"?>
<CheckedTextView xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:background="@drawable/list_selector"
.../>
3) Der Hintergrundfarbzustand (list_selector.xml
) definiert die Hervorhebungsfarbe
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:drawable="@color/green" Android:state_checked="true"/>
<item Android:drawable="@color/green" Android:state_pressed="true"/>
</selector>
Maaalte ist korrekt, im Touch-Modus wird in Listen nicht die Fokusmarkierung für ein aktuelles Objekt angezeigt, da sich im Touch-Modus kein aktuelles Objekt befindet. Eine zustandsorientierte Auswahl, wie Sie sie beschreiben, die bestehen bleibt, während Sie mit anderen Teilen der Benutzeroberfläche interagieren, ist jedoch eine andere Angelegenheit.
Sie können CHOICE_MODE_SINGLE verwenden, um eine stateful-Auswahl in einer Liste auszudrücken. Die Auswahl wird als geprüfter Status behandelt. Solange die Ansicht, die Ihr Adapter zurückgibt, die Checkable-Schnittstelle implementiert, können Sie den ausgewählten Status nach Belieben anzeigen. (Festlegen eines Hintergrunds in der Elementansicht oder auf andere Weise. Es muss nicht wirklich ein Kontrollkästchen-Widget angezeigt werden.) Sie können dann die mit Element markierten Methoden von ListView verwenden, um die Auswahl zu ändern oder zu bestimmen.
Ich habe dieses Problem gelöst, indem ich die ListView erweitert und die getView () -Methode überschrieben habe. Ich behielt einen internen Bezeichner für den "ausgewählten" Zustand und änderte den Hintergrund des Elements entsprechend wie folgt:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View currView = super.getView(position, convertView, parent);
StateListItem currItem = getItem(position);
if (currItem.isItemSelected) {
currView.setBackgroundColor(Color.RED);
} else {
currView.setBackgroundColor(Color.BLACK);
}
return currView;
}
Ich habe ein Beispielprogramm in meinem Blogpost: http://udinic.wordpress.com/2011/07/01/selectablelistview-make-selection-work/
Hier ist meine Lösung Listview:
<ListView
Android:id="@+id/list"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:background="@Android:color/white"
Android:divider="@Android:color/darker_gray"
Android:dividerHeight="1dp"
Android:paddingLeft="10dip"
Android:paddingRight="10dip"
Android:choiceMode="singleChoice"
Android:paddingTop="8dip" >
</ListView>
Schreiben Sie einen Selektor für list_row als
<!-- <item Android:drawable="@color/Android:transparent" Android:state_selected="true" /> -->
<item Android:drawable="@Android:color/darker_gray" Android:state_selected="true"/>
<item Android:drawable="@Android:color/darker_gray" Android:state_activated="true"/>
<item Android:drawable="@Android:color/darker_gray" Android:state_pressed="true"/>
<item Android:drawable="@color/Android:transparent"/>
Stellen Sie sicher, dass Sie item für state_activated = true haben
Fügen Sie dann diesen Selektor als Hintergrund für list_row hinzu
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:background="@drawable/listitem_selector"
Android:orientation="vertical" >
<TextView
Android:id="@+id/itemName"
Android:layout_width="match_parent"
Android:layout_height="match_parent" />
Android:background="?activatedBackgroundIndicator
hinzufügen
das Hauptlayout des Elements ähnlich wie Android.R.layout.simple_list_item_activated_2.xml
auflisten
Implementieren Sie Ihre Liste im Single Choice-Modus: Android:choiceMode=singleChoice
So wie der Standardcode Android.R.layout.simple_list_item_single_choice
eine RadioButton
zur Kennzeichnung der ausgewählten Auswahl verwendet, können Sie einen benutzerdefinierten Hervorhebungsstatus oder ähnliches in Ihrem Listenelementlayout implementieren, um auf die Auswahländerungen zu reagieren. Methoden wie getCheckedItemPosition()
können von Ihrer Anwendung verwendet werden, um festzustellen, welches Element der Benutzer aktuell ausgewählt hat.
Hoffentlich hilft das!
Ich weiß, dass diese Frage seit zwei Jahren nicht mehr aktiv war, aber für den Fall, dass jemand anderes sie in Zukunft braucht. Hier ist mein ListView-XML-Code
<ListView
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:id="@+id/results"
Android:choiceMode="singleChoice"
Android:listSelector="#ffdb700b"/>
Sie möchten den Android:listSelector
-Wert ändern.
Die folgende Lösung kann zum Hervorheben eines oder mehrerer Listenelemente verwendet werden. Ausgangspunkt: Es gibt ein ListFragment, um eine Liste von MyEntity über eine ArrayAdapter-Implementierung anzuzeigen. Die Farbe einer TextView als Teil des Elementlayouts muss in Grau geändert werden, wenn das Element ausgewählt ist. Mehrere Elemente sollten auswählbar sein.
Das ListFragment muss einen OnItemSelectListener (YourEntity-Eintrag) bereitstellen, der in onListItemClicked () aufgerufen wird.
public void onListItemClick(ListView l, View v, int position, long id) {
MyEntity entity = (MyEntity) getListView().getItemAtPosition(position);
if (entityListSelectListener != null)
itemSelectListener.onItemSelect(entity); }
Der ArrayAdapter besitzt eine Liste für die Schlüsselfelder für die ausgewählten Elemente und stellt die Manager-Methoden addSelection (MyEntity) und clearAllSelections () bereit. Die Overriden-Methode getView () liest die Schlüsselfeldliste und ändert die jeweilige TextView-Farbe in Grau, wenn sich die tatsächliche Position darin befindet, ansonsten in Transparent.
public View getView(int position, View convertView, ViewGroup parent) {
...
if (selectedEntityList.contains(entity.key)) //... highlight view field }
In onCreate () der besitzenden Aktivität müssen die Listener implementiert werden, um den ArrayAdapter zu verwalten: Aufrufen von addSelection () und notifyDataSetChanged ().
entityListFragment.setEntityListSelectListener(
new EntityListFragment.OnItemSelectedListener() {
public void onItemSelect(MyEntity entity) {
aa.addSelection(entity);
aa.notifyDataSetChanged(); }});
Ich hatte das gleiche Problem, ich habe es durch Einfügen des folgenden Codes in den ListView-Code gelöst
Android:choiceMode="singleChoice"
Android:listSelector="#003366"
Die XML-Datei sieht folgendermaßen aus
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent">
<ListView
Android:id="@+id/file_list"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:choiceMode="singleChoice"
Android:listSelector="#003366"/>
<Button
Android:id="@+id/select"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:text="SELECT"
Android:layout_below="@id/file_list"/>
</RelativeLayout>
In meinem Fall bestand die einzige Lösung bei der Verwendung von simple_list_item_2 darin, die getView () - Methode des Adapters zu überschreiben und die Hintergrundfarbe einfach manuell zu ändern:
listview = new SimpleAdapter(ctx, data,
Android.R.layout.simple_list_item_2, res,
new String[] {"field1", "field2" },
new int[] {Android.R.id.text1, Android.R.id.text2 })
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = super.getView(position, convertView, parent);
if (this_is_the_selected_item)
{
view.setBackgroundColor(0xff999999);
}
else
{
view.setBackgroundColor(Color.BLACK);
}
return view;
}
};
Denken Sie daran, listview.invalidateViews () aufzurufen, wenn Sie das ausgewählte Element ändern.
Hier ist was ich getan habe :) - nachdem der Kopf heftig gegen die Wand geschlagen wurde.
Für den Adapter:
radioAdapter = new RadioAdapter(context, R.layout.row_layout, yourData);
Für die row_layout.xml:
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/radio_name"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:layout_gravity="center_vertical"
Android:padding="10dp"
Android:background="?android:attr/activatedBackgroundIndicator"
Android:clickable="true"
Android:text="SOME RADIO"
Android:textColor="@color/Gray"
Android:textSize="25dp" />
Um eine hervorgehobene Standardposition festzulegen, tun Sie dies einfach für Ihr listView-Objekt:
radioTitleList.setItemChecked (defaultPosition, true);
Wenn Sie hervorheben möchten, wenn Sie auf die Liste klicken:
Fügen Sie in Ihrem getView () in Ihrem benutzerdefinierten Listenadapter dies hinzu, bevor Sie die Ansicht zurückgeben:
row.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View arg0)
{
radioTitleList.setItemChecked(position, true);
// other stuff like navigating to a new activity etc
}
});