Android ListView ausgewählte Elemente bleiben hervorgehoben

Lesezeit: 7 Minuten

Android ListView ausgewahlte Elemente bleiben hervorgehoben
Kelta

ich habe ein XML mit zwei ListVieweine mit einer Liste von Kunden, die durch eine Auswahlabfrage (lv_cli) und die andere mit den Details des ausgewählten Kunden (lv_cli_det). Ich möchte den Client in ausgewählt lassen lv_cli während lv_cli_det Details zeigen.

XML:

<ListView
    android:id="@+id/cli_lista"
    android:layout_width="512dp"
    android:layout_height="wrap_content"
    android:fadeScrollbars="false"
    >
</ListView>

<ListView
    android:id="@+id/cli_lista_det"
    android:layout_width="512dp"
    android:layout_height="wrap_content"
    android:layout_toRightOf="@+id/cli_lista"
    android:fadeScrollbars="false" >
</ListView>

Java:

Cursor cursor = db.rawQuery("Select NrCl||';'||Nome From Clientes", null);
final ListView t = (ListView)findViewById(R.id.cli_lista);
ArrayAdapter<String> myarrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1, listItems);
t.setAdapter(myarrayAdapter);

final ListView td = (ListView)findViewById(R.id.cli_lista_detalhe);
final ArrayAdapter<String> myarrayAdapter2 = new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1, listItems2);

t.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        String item = ((TextView)view).getText().toString();
        String[] strArray = item.split("\;");

        cli.load(strArray[0].toString());
        td.setAdapter(myarrayAdapter2);
        listItems2.clear();
        listItems2.add("Nome: " + cli.getNome());
        listItems2.add("Morada: " + cli.getMorada());
        listItems2.add("Localidade: " + cli.getLoca());
        listItems2.add("Código Postal: " + cli.getCp());
        listItems2.add("Pais: " + cli.getPais());
        listItems2.add("Nif: " + cli.getNif());
        listItems2.add("Tel: " + cli.getTel());
        listItems2.add("Tlm: " + cli.getTlm());
        listItems2.add("Tipo Preço: " + cli.getTipoPvn());
        listItems2.add("Cond. Pagamento: " + cli.getCpg());
        listItems2.add("Obs: " + cli.getObs());
        td.setAdapter(myarrayAdapter2);
        myarrayAdapter2.notifyDataSetChanged(); 
    }
});

  • Zeigen Sie Ihren Code. du hast fragment verwendet oder was??

    – Avinash Kumar Pankaj

    24. April 13 um 10:31 Uhr

  • einfach umgekehrt machen. Wie codieren Sie für die Highlight-Listenansicht? Postleitzahl hier..

    – Dhaval Parmar

    24. April 13 um 10:32 Uhr

  • stackoverflow.com/a/15898103/726863

    – Lalit Poptani

    24. April 13 um 11:57 Uhr

1644311348 644 Android ListView ausgewahlte Elemente bleiben hervorgehoben
AJG

Ich habe den richtigen Weg gefunden. Es ist sehr einfach. Beschreiben Sie in der Ressource Folgendes:

android:choiceMode="singleChoice"
android:listSelector="#666666"

(oder Sie können anstelle des Farbwerts einen Ressourcenlink angeben)

Programmatisch:

listView.setSelector(Drawable selector);
listView.setSelector(int resourceId);
listView.setChoiceMode(int mode);

Modus kann einer der folgenden sein: AbsListView.CHOICE_MODE_SINGLE, AbsListView.CHOICE_MODE_MULTIPLE, AbsListView.CHOICE_MODE_NONE (Standard)

(AbsListView ist der abstrakte Vorfahr der ListView-Klasse)

PS-Manipulationen mit onItemClick und wechselndem Ansichtshintergrund sind bankrott, weil eine Ansicht selbst ein temporäres Objekt ist. Daher dürfen Sie eine Ansicht nicht verfolgen.

Wenn unsere Liste lang genug ist, werden die mit herausgescrollten Elementen verknüpften Ansichten aus der Hierarchie entfernt und neu erstellt, wenn diese Elemente erneut angezeigt werden (mit zwischengespeicherten Anzeigeoptionen, z. B. Hintergrund). Die von uns verfolgte Ansicht ist also jetzt keine tatsächliche Ansicht des Elements, und das Ändern des Hintergrunds ändert nichts an der tatsächlichen Elementansicht. Als Ergebnis haben wir mehrere Artikel ausgewählt.

  • Dies sollte als Antwort akzeptiert werden. Einfach und sehr effizient.

    – Chostakowitsch

    28. Mai ’15 um 20:31 Uhr

  • Einfache und elegante Antwort!

    – dunkler Ritter

    2. Juni 15 um 9:21 Uhr

  • Obwohl andere Antworten richtig sind, ist diese sauber und einfach.

    – Velval

    16. Juni 15 um 5:36 Uhr

  • Ich möchte, dass eines der listView-Elemente standardmäßig ausgewählt ist. Wie kann ich das tun?

    – Apura

    14. Januar 16 um 19:08 Uhr


  • @AJG Wenn ich den Modus von single auf Multiple ändere, funktioniert es nicht. Es zeigt nur das zuletzt ausgewählte Element farbig an. Aber ich möchte, dass wenn ich drei Elemente auswähle, dann müssen alle drei farbig sein.

    – Ajay Sharma

    29. Juli 16 um 7:19 Uhr

Android ListView ausgewahlte Elemente bleiben hervorgehoben
Neoh

Um die Farbe des Listenansichtselements beim Drücken beizubehalten, fügen Sie die folgende Zeile in Ihr Listenansichtselement-Layout ein:

android:background="@drawable/bg_key"

Dann definieren bg_key.xml in drawable Ordner so:

<?xml version="1.0" encoding="utf-8" ?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item 
        android:state_selected="true"
        android:drawable="@color/pressed_color"/>
    <item
        android:drawable="@color/default_color" />
</selector>

Fügen Sie dies schließlich in Ihre ein ListView onClickListener:

listView.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,long arg3) {
        view.setSelected(true);
        ... // Anything
    }
});

Auf diese Weise wird immer nur ein Element farblich ausgewählt. Sie können Ihre Farbwerte in definieren res/values/colors.xml mit sowas:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="pressed_color">#4d90fe</color>
    <color name="default_color">#ffffff</color>
</resources>

  • error: Fehler: Keine Ressource gefunden, die dem angegebenen Namen entspricht (bei ‘drawable’ mit dem Wert ‘@drawable/pressed_color’). Fehler: Fehler: Keine Ressource gefunden, die dem angegebenen Namen entspricht (bei ‘drawable’ mit dem Wert ‘@color/default_color’).

    – Kelta

    24. April 13 um 11:05 Uhr

  • Der Farbname ist nur ein Beispiel. Es zeigt, dass Sie entweder 1) ein 9-Patch-Farbbild im PNG-Format erstellen und es dann in den drawable-Ordner legen können, oder 2) die Farbe in res/values/colors.xml definieren und dann mit android:drawable=”@ aufrufen können Farbe/Ihre Farbe”. Sie müssen zuerst die colors.xml erstellen, falls sie nicht vorhanden ist.

    – Neoh

    24. April 13 um 11:19 Uhr


  • Funktioniert die erste Listenansicht richtig? Sie müssen dasselbe für die Layout-XML der zweiten Listenansicht und ihren onClickListener () tun.

    – Neoh

    24. April 13 um 11:40 Uhr

  • Ich brauche die zweite Listenansicht nicht, um sich wie die erste zu verhalten

    – Kelta

    24. April 13 um 11:42 Uhr

  • Diese Methode sollte in das offizielle Android-Dokument geschrieben werden.

    – Richard

    19. Januar 15 um 4:37 Uhr

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

            for (int j = 0; j < adapterView.getChildCount(); j++)
                adapterView.getChildAt(j).setBackgroundColor(Color.TRANSPARENT);

            // change the background color of the selected element
            view.setBackgroundColor(Color.LTGRAY);
});

Vielleicht möchten Sie das aktuell ausgewählte Element in einer globalen Variablen mit dem Index i speichern.

  • Etwas Seltsames passiert, wenn die Tastatur angezeigt wird. Es erfolgt eine Mehrfachauswahl.

    – Ricardo

    22. April 14 um 22:32 Uhr

  • Dies ist falsch, da die Listenansicht, um Speicher zu sparen, alle 10 Elemente dieselben Ansichten zu verwenden scheint (oder wahrscheinlich alle n Elemente, wobei n größer ist als die Anzahl der auf dem Bildschirm sichtbaren Elemente). Deshalb findet eine Mehrfachauswahl statt.

    – Marco

    24. März 15 um 21:09 Uhr

Der vereinfachte Weg ist, wenn Sie eine Listenansicht in einer XML-Datei verwenden, verwenden Sie diese Attribute in Ihrer Listenansicht.

android:choiceMode="singleChoice"
android:listSelector="#your color code"

Wenn Sie XML nicht verwenden, programmgesteuert

listview.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE);
listview.setSelector(android.R.color.holo_blue_light);

Sie brauchen einen Selektor wie diesen:

<selector xmlns:android="http://schemas.android.com/apk/res/android">

<!-- State when a row is being pressed, but hasn't yet been activated (finger down) -->
<item android:drawable="@color/app_primary_color_light" android:state_pressed="true" />

<!-- Used when the view is "activated". -->
<item android:drawable="@color/app_primary_color" android:state_activated="true" />

<!-- Default, "just hangin' out" state. -->
<item android:drawable="@android:color/transparent" /></selector>

Und dann einstellen android:choiceMode="singleChoice" zu Ihrer Listenansicht.

  • Vergessen Sie nicht, die Zeile hinzuzufügen: android:listselector="@drawable/my_selector" in Ihrer Listenansicht!

    – SMBiggs

    24. Mai 16 um 21:03 Uhr

  • Diese Lösung funktioniert für mich in Android Kitkat 19 Vielen Dank

    – Doktor Untergang

    19. Dezember 18 um 11:26 Uhr

1644311351 673 Android ListView ausgewahlte Elemente bleiben hervorgehoben
rmunn

Am Beispiel von Avinash Kumar Pankaj

View v;

dann bei der oncreate-Methode

v = new View(getActivity());

und dann die onlistitemclick-Methode, die ich geschrieben habe

public void onListItemClick(ListView listView, View view, int position,
       long id) {
   v.setBackgroundResource(0);
   view.setBackgroundResource(R.color.green);
   v = view;
}

Es hat für mich funktioniert. Danke schön.

ich ersetzte

v = new View(getActivity());

zu

v = new View(this);

und der Code hat gut funktioniert.

Es sind auch die XML-Dateien ‘colors’ und ‘bg_key’ aus den vorherigen Beispielen sowie das ListView-Attribut android:background=”@drawable/bg_key” erforderlich.

Mauro

  • Vergessen Sie nicht, die Zeile hinzuzufügen: android:listselector="@drawable/my_selector" in Ihrer Listenansicht!

    – SMBiggs

    24. Mai 16 um 21:03 Uhr

  • Diese Lösung funktioniert für mich in Android Kitkat 19 Vielen Dank

    – Doktor Untergang

    19. Dezember 18 um 11:26 Uhr

1644311351 112 Android ListView ausgewahlte Elemente bleiben hervorgehoben
Shahin Fasihi

*Bitte stellen Sie sicher, dass sich in Ihrem Root-Layout des Listenansichtscontainers kein Ripple befindet

Fügen Sie diese Zeile Ihrer Listenansicht hinzu

android:listSelector="@drawable/background_listview"

Hier ist die Datei “background_listview.xml”.

<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/white_background" android:state_pressed="true" />
<item android:drawable="@color/primary_color" android:state_focused="false" /></selector>

die Farben, die in der Datei background_listview.xml verwendet wurden:

<color name="primary_color">#cc7e00</color>
<color name="white_background">#ffffffff</color>

nach diesen

(angeklicktes Element enthält orange Farbe, bis Sie auf ein anderes Element klicken)

.

820730cookie-checkAndroid ListView ausgewählte Elemente bleiben hervorgehoben

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy