it-swarm.com.de

Markieren Sie ListView ausgewählte Zeile

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?

37
user611089

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.

35
Maaalte

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>
42
Hiep

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.

19
adamp

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/

12
Udinic

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" />

11
subair_a

Android:background="?activatedBackgroundIndicator hinzufügen 
das Hauptlayout des Elements ähnlich wie Android.R.layout.simple_list_item_activated_2.xml auflisten

6
denis

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!

5
Devunwired

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.

4
jrsall92

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.

  1. 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); }
    
  2. 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 }
    
  3. 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>
2
Rijul Gupta

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.

1
CpnCrunch

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
     }
 });
0
ryvianstyron