ListView-Objekthintergrund über benutzerdefinierten Selektor

Ist es möglich, einen benutzerdefinierten Hintergrund über den Listen-Selektor auf jedes Listview-Objekt anzuwenden?

Der Standardselektor gibt @android:color/transparent für den state_focused="false" -Fall an. Wenn Sie dies jedoch in einen benutzerdefinierten Zeichenbereich ändern, wirkt sich dies nicht auf Elemente aus, die nicht ausgewählt sind. Romain Guy scheint in dieser Antwort darauf hinzuweisen, dass dies möglich ist.

Ich erziele den gleichen Effekt, indem ich einen benutzerdefinierten Hintergrund für jede Ansicht verwende und ihn verstecke, wenn das Element ausgewählt / fokussiert / was auch immer ist, so dass der Selektor angezeigt wird, aber es wäre eleganter, dies alles an einer Stelle definiert zu haben.

Zur Referenz: Dies ist der Selektor, den ich verwende, um zu versuchen, dass dies funktioniert:

          

Und so setze ich den Selektor:

  

Vielen Dank im Voraus für jede Hilfe!

Solutions Collecting From Web of "ListView-Objekthintergrund über benutzerdefinierten Selektor"

Ich war selbst frustriert und habe es schließlich getriggers. Wie Romain Guy angedeutet hat, gibt es einen anderen Zustand, "android:state_selected" , den Sie verwenden müssen. Verwenden Sie einen Zustand, der für den Hintergrund Ihres Listenelements gezeichnet werden kann, und verwenden Sie einen anderen für listSelector Ihrer Liste ausklappbaren listSelector :

list_row_layout.xml:

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

listitem_background.xml:

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

layout.xml, die die ListView enthält:

 ...  ... 

listitem_selector.xml:

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

Die Lösung von dglmtn funktioniert nicht, wenn Sie einen 9-Patch haben, der mit Padding als Hintergrund gezeichnet werden kann. Seltsame Dinge passieren, ich will nicht einmal darüber reden, wenn du ein solches Problem hast, kennst du sie.

Jetzt, wenn Sie eine Listenansicht mit verschiedenen Zuständen und 9-Patch-Zeichen haben möchten (es würde mit allen Zeichen und colors funktionieren, denke ich), müssen Sie 2 Dinge tun:

  1. Legen Sie die Auswahl für die Elemente in der Liste fest.
  2. Entfernen Sie den Standardselektor für die Liste.

Was Sie tun sollten, ist zuerst die row_selector.xml:

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

Vergessen Sie nicht den android:state_selected . Es funktioniert wie android:state_focused für die Liste, aber es wird für das Listenelement angewendet.

Übernehmen Sie nun den Selektor für die Elemente (row.xml):

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

Machen Sie einen transparenten Selektor für die Liste:

  

Das sollte das Ding machen.

Verwenden Sie niemals eine “Hintergrundfarbe” für Ihre Listenansichtszeilen …

Dies wird jede Selektoraktion blockieren (war mein Problem!)

Viel Glück!

Der Artikel “Warum ist meine Liste schwarz? Eine Android-Optimierung” im Android-Entwickler-Blog hat eine gründliche Erklärung dafür, warum der Listenhintergrund beim Scrollen schwarz wird. Einfache Antwort: Setzen Sie cacheColorHint auf Ihrer Liste auf transparent (# 00000000).

Es reicht, wenn Sie list_row_layout.xml :

 ...  

listitem_selector.xml:

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

Anstatt von:

 android:drawable="@color/transparent" 

schreiben

 android:drawable="@android:color/transparent" 

Sie können ein Thema schreiben:

 
 android:name=".List10" android:theme="@style/Theme"

theme.xml

  

styles.xml

   

Mein_Selektor ist Ihr Wunsch zum benutzerdefinierten Selektor Es tut mir leid, ich weiß nicht, wie ich meinen Code schreibe

Ich bin nicht sicher, wie Sie Ihren gewünschten Effekt durch den Selektor selbst erreichen können – schließlich gibt es definitionsgemäß einen Selektor für die gesamte Liste.

Sie können jedoch die Auswahl ändern und zeichnen, was Sie wollen. In diesem Beispielprojekt mache ich den Selektor transparent und zeichne eine Leiste für das ausgewählte Objekt.

Ich benutze immer die gleiche Methode und es funktioniert jedes Mal, wo auch immer: Ich benutze einfach einen Selektor wie diesen

    

und setzen Sie das Attribut auf das ListView (DIES IST SEHR WICHTIG, UM ES ZU ARBEITEN)

 android:choiceMode="singleChoice" 

für die textColor einfach in den Farbordner (WICHTIG, nicht zeichnbarer Ordner!) einen Selektor wie diesen legen

    

Dies ist eine Beispielzeilenvorlage

   

Alles funktioniert ohne langwierige Workarounds. Ich hoffe das hilft

FrostWire Team hier drüben.

Alle Selektor-Mist-API funktioniert nicht wie erwartet. Nachdem wir alle in diesem Thread vorgestellten Lösungen nicht gut ausprobiert haben, haben wir das Problem gerade getriggers, als wir das ListView Item aufgebläht haben.

  1. Stellen Sie sicher, dass Ihr Element seinen Status behält, wir haben es als eine Member-Variable des MenuItems (boolean ausgewählt)

  2. Fragen Sie beim Aufblasen nach, ob das zugrunde liegende Element ausgewählt ist. Wenn ja, legen Sie einfach die gewünschte ausklappbare Ressource als Hintergrund fest (sei es ein 9-Feld oder was auch immer). Stellen Sie sicher, dass der Adapter dies erkennt und notifyDataChanged () aufruft, wenn etwas ausgewählt wurde.

      @Override public View getView(int position, View convertView, ViewGroup parent) { View rowView = convertView; if (rowView == null) { LayoutInflater inflater = act.getLayoutInflater(); rowView = inflater.inflate(R.layout.slidemenu_listitem, null); MenuItemHolder viewHolder = new MenuItemHolder(); viewHolder.label = (TextView) rowView.findViewById(R.id.slidemenu_item_label); viewHolder.icon = (ImageView) rowView.findViewById(R.id.slidemenu_item_icon); rowView.setTag(viewHolder); } MenuItemHolder holder = (MenuItemHolder) rowView.getTag(); String s = items[position].label; holder.label.setText(s); holder.icon.setImageDrawable(items[position].icon); //Here comes the magic rowView.setSelected(items[position].selected); rowView.setBackgroundResource((rowView.isSelected()) ? R.drawable.slidemenu_item_background_selected : R.drawable.slidemenu_item_background); return rowView; } 

Es wäre wirklich schön, wenn die Selektoren tatsächlich funktionieren würden, in der Theorie ist es eine schöne und elegante Lösung, aber es scheint, als wäre sie kaputt. KUSS.