webentwicklung-frage-antwort-db.com.de

Ändern Sie die Auswahl in einer ListView von Orange zu Grün

Wie mache ich das für jedes ausgewählte Listenelement?.

Ich habe versucht, dies zu Android:background hinzuzufügen.

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:state_focused="true" 
        Android:state_pressed="false"
        Android:drawable="@color/Android_green" />
    <item Android:state_focused="true" 
        Android:state_pressed="true"
        Android:drawable="@color/black_alpha" />
    <item Android:state_focused="false" 
        Android:state_pressed="true"
        Android:drawable="@color/black_alpha" />
    <item Android:drawable="@color/white_alpha" />
</selector> 

aber es funktioniert nicht, es ändert sich die gesamte ListView.


Immer noch nicht funktioniert, hier ist was ich bis jetzt habe

:: listview_background

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:state_focused="true" Android:drawable="@color/black_alpha" />
    <item Android:drawable="@color/white_alpha" />  
</selector> 

:: Meine Ansicht, die das Obige verwendet

<ListView Android:id="@+id/list" Android:layout_width="fill_parent"
    Android:layout_height="fill_parent" Android:layout_below="@+id/round"
    Android:listSelector="@drawable/listview_background">
</ListView>

Das Problem ist, dass black_alpha die gesamte Liste anwendet, nicht nur das ausgewählte Listenelement

22
jax

Hier ist ein guter Artikel , wie Selektoren mit Listen verwendet werden.

Anstatt es als Android:background des ListView festzulegen, möchten Sie Android:listSelector wie folgt einstellen:

<ListView Android:id="@+id/list" 
      Android:layout_width="fill_parent"
      Android:layout_height="wrap_content" 
      Android:layout_gravity="center"
      Android:divider="@null" 
      Android:dividerHeight="0dip"
      Android:listSelector="@drawable/list_selector" />
21
Jay Askren

Jax, du hast das gesagt:

Das Problem ist, dass black_alpha die gesamte Liste anwendet, nicht nur das ausgewählte Listenelement

Ich hatte das gleiche Problem. Nachdem ich eine Weile mit ihm herumgespielt hatte, konnte ich die Farbe auf die gesamte Liste anwenden, indem ich ein 3x3-png-Bild der gewünschten Farbe verwendete, anstatt eine Farbe anzuwenden. Wenn Sie eine Farbe verwenden, haben Sie aus irgendeinem seltsamen Grund ein merkwürdiges Hintergrundverhalten. Wenn Sie ein png verwenden, funktioniert es einwandfrei. : S

Das ist also eine Möglichkeit, es zu umgehen.

-----Ein anderer Weg----------

Ich habe die besten Ergebnisse gefunden, wenn ich den ListView-Selector so eingestellt habe, dass er keine Zustände wie diese hat:

res/drawable/list_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
</selector>

Dann kümmere ich mich um alle Zustände im Hintergrund des Listenelements. NICHT in der Auswahl. Ich fand, dass ich auf diese Weise mehr Kontrolle hatte.

res/color/list_item_bg.xml

<?xml version="1.0" encoding="utf-8"?>
   <selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:state_selected="false"
    Android:state_pressed="false" 
    Android:drawable="@color/list_item_black_translucent" />
<item Android:state_pressed="true" 
    Android:drawable="@color/light_green_accent_translucent" />
</selector>

Dann ist hier mein Listeneintrag:

res/layout/simple_list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:orientation="horizontal"
Android:paddingRight="45dip"
Android:paddingBottom="2dip"
Android:layout_gravity="center_vertical"
Android:background="@color/list_item_bg">
  <ImageView
    Android:id="@+id/arrow"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_marginRight="8dip"
    Android:src="@drawable/list_item_arrow" />
 <TextView
Android:id="@+id/simple_list_item_label"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:gravity="center_vertical"
Android:textSize="12sp"
Android:textColor="@color/list_label_color"/>
</LinearLayout>
8
b-ryce

Ich stand auch vor Ihrem Problem, wo die Farbänderung für die gesamte Liste gilt. 

Aber jetzt arbeitet es für mich:

Meine Hauptseite mit der Listenansicht (habe festgestellt, dass der Listenauswahlbereich hier nicht angewendet wurde): 

 <ListView 
    Android:id="@+id/controlList" Android:layout_width="wrap_content" Android:layout_height="wrap_content"/>

Anstatt den listselector auf getView zu übertragen, wird wie bei tell diese bestimmte Zeile (convertView) die listselector.xml in drawable foldable verwendet, wenn sich ihr Status ändert, z. gepresst, fokussiert ...:

@Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder viewHolder;
            if(convertView == null){
                LayoutInflater li = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
                convertView = li.inflate(R.layout.control_list, null);
                viewHolder = new ViewHolder();

                viewHolder.topText = (TextView) convertView.findViewById(R.id.toptext);
                viewHolder.bottomText = (TextView) convertView.findViewById(R.id.bottomtext);
                convertView.setTag(viewHolder);

            }
            else{
                viewHolder = (ViewHolder) convertView.getTag();
            }


                    //each convertView will be assigned the listselector
            convertView.setBackgroundResource(R.drawable.listselector);


            viewHolder.topText.setText(testSchemes[position]);

            //viewHolder.vText.setText(testDetails[position]);
            return convertView;
        }

Und zum Schluss noch meine listselector.xml:

<?xml version="1.0" encoding="utf-8"?>

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:state_pressed="false"
        Android:state_selected="false"
        Android:drawable="@color/lightgreen" />

    <!-- Even though these two point to the same resource, have two states so the drawable will invalidate itself when coming out of pressed state. -->
    <item Android:state_pressed="true" 

        Android:drawable="@color/darkgreen" />

    <item Android:state_selected="true" Android:state_pressed="false"
        Android:drawable="@color/orange" />



</selector>

Der obige Code bewirkt Folgendes: Alle Einträge, die zum ersten Mal geladen werden, sind hellgrün . Wenn Sie den Cursor mit dem Cursor nach oben und unten bewegen, wird der ausgewählte Eintrag orange hervorgehoben.

3
Bkteo

Als Bigstones in einem Kommentar erwähnt, verwendet eine funktionierende Lösung eine Form anstelle einer Farbe (ich habe auch die gesamte Liste hervorgehoben). Hier ist eine Komplettlösung:

fügen Sie diese 2 Attribute zur Listenansicht hinzu:

Android:drawSelectorOnTop="true"
Android:listSelector="@drawable/my_list_selector"

fügen Sie my_list_selector.xml dem drawable-Ordner hinzu:

<?xml version="1.0" encoding="UTF-8"?> 
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android" Android:shape="rectangle"> 
    <solid Android:color="#77526F35"/>
</shape>

Jetzt sollten die Listenelemente im gedrückten Zustand eine semitransparente grüne Überlagerung anzeigen.

2
Ixx

Ich war mit dem gleichen Problem konfrontiert und brauchte nur eine einfache Zeile in meiner Artikelansicht-XML.

    Android:background="?android:attr/activatedBackgroundIndicator"

Überprüfen Sie diesen Beitrag: Dieser Beitrag könnte helfen 

0
Joan P.S