it-swarm.com.de

Hintergrundfarbe des ausgewählten Elements in einer ListView ändern

Ich möchte wissen, wie ich die Hintergrundfarbe des ausgewählten Elements in meiner listView ändern kann. Ich möchte nur das bestimmte Element ändern, auf das der Benutzer geklickt hat. Das heißt, wenn der Benutzer auf ein anderes Element klickt, wird es das hervorgehobene Element. Nun, da ich es so einfach wie möglich halten und die standardmäßige Android-Listenansicht verwenden möchte, habe ich stattdessen diesen Code verwendet:

record_list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                try{
                    for (int ctr=0;ctr<=record_items.length;ctr++){
                        if(i==ctr){
                            record_list.getChildAt(ctr).setBackgroundColor(Color.CYAN);
                        }else{
                            record_list.getChildAt(ctr).setBackgroundColor(Color.WHITE);
                        }
                    }
                }
                catch (Exception e){
                    e.printStackTrace();
                }
                Log.v("Selected item",record_list.getItemAtPosition(i));
            }
        });

Ok, das funktioniert, aber das Problem ist, dass es langsam ist. Jetzt möchte ich wissen, ob es einen anderen Weg gibt, den ich tun kann, der die gleiche Ausgabe liefert wie ich.

Ich habe versucht, record_list.getSelectedView().setBackgroundColor(Color.CYAN); zu verwenden, aber es gibt eine Nullzeiger-Ausnahme.

Ich habe auch die selector.xml ausprobiert, aber sie hat den Trick auch nicht gemacht .. Außerdem gibt es hier auf ListView eine Eigenschaft, die listSelector heißt. Es ist ein Zeichnungssatz, wie aus der Dokumentation "Zeichnungssatz zur Kennzeichnung des aktuell ausgewählten Elements in der Liste" hervorgeht. Ich glaube auch, dass dies den Trick tun sollte, und zwar den Trick mit meinem Emulator, aber nicht mit meiner Galaxie. Ich habe auch die anderen Methoden ausprobiert, aber nichts funktioniert so, wie ich es wollte.

49
KaHeL

Sie können die Position des aktuell ausgewählten Elements verfolgen:

    OnItemClickListener listViewOnItemClick = new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> adapter, View arg1, int position, long id) {
                mSelectedItem = position;
                mAdapter.notifyDataSetChanged();
        }
    };

Und überschreiben Sie die getView-Methode Ihres Adapters:

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final View view = View.inflate(context, R.layout.item_list, null);

        if (position == mSelectedItem) {
            // set your color
        }

        return view;
    }

Für mich hat es den Trick gemacht.

68
Esteam

Sie können einen Wahlschalter verwenden. Ändern Sie die Farbwerte und ändern Sie die nachstehenden Angaben entsprechend Ihren Anforderungen.

bkg.xml im gezeichneten Ordner

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

gepresste.xml im Zeichenordner

<?xml version="1.0" encoding="UTF-8"?> 
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android"> 
<solid Android:color="#FF1A47"/>  // color   
<stroke Android:width="3dp"
        Android:color="#0FECFF"/> // border
<padding Android:left="5dp"
         Android:top="5dp"
         Android:right="5dp"
         Android:bottom="5dp"/> 
<corners Android:bottomRightRadius="7dp" // for rounded corners
         Android:bottomLeftRadius="7dp" 
         Android:topLeftRadius="7dp"
         Android:topRightRadius="7dp"/> 
</shape>

normal.xml im gezeichneten Ordner

<?xml version="1.0" encoding="UTF-8"?> 
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android"> 
<solid Android:color="#FFFFFF"/>    
<stroke Android:width="3dp"
        Android:color="#0FECFF" />

<padding Android:left="5dp"
         Android:top="5dp"
         Android:right="5dp"
         Android:bottom="5dp"/> 
<corners Android:bottomRightRadius="7dp"
         Android:bottomLeftRadius="7dp" 
         Android:topLeftRadius="7dp"
         Android:topRightRadius="7dp"/> 
</shape>

Legen Sie den Hintergrund für das Zeichnen auf das benutzerdefinierte Listenlayout für jede Zeile fest

Ich empfehle die Verwendung einer benutzerdefinierten Listenansicht mit einem benutzerdefinierten Adapter.

  Android:background="@drawable/bkg"     

Wenn Sie keinen benutzerdefinierten Adapter verwendet haben, können Sie den Listselector wie unten auf Listview setzen

   Android:listSelector="@drawable/bkg" 
67
Raghunandan

Variable definieren

private ListView mListView;

Variable initialisieren  

mListView = (ListView)findViewById(R.id.list_view);

OnItemClickListener der Listenansicht

   mListView.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> adpterView, View view, int position,
                long id) {
            for (int i = 0; i < mListView.getChildCount(); i++) {
                if(position == i ){
                    mListView.getChildAt(i).setBackgroundColor(Color.BLUE);     
                }else{
                    mListView.getChildAt(i).setBackgroundColor(Color.TRANSPARENT);
                }
            }
        }
    });

Projekt erstellen und ausführen - Fertig

22
Hiren Patel

Wenn Sie möchten, dass das Element nach dem Klicken auf hervorgehoben wird, müssen Sie es manuell im Listener onItemClick auswählen

Android ListEine ausgewählte Option bleibt hervorgehoben :

myList.setOnItemClickListener(new OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {   
        view.setSelected(true); // <== Will cause the highlight to remain
        //... do more stuff                          
    }});

Es wird davon ausgegangen, dass sich in Ihrem Selector ein state_selected-Element befindet:

<?xml version="1.0" encoding="utf-8"?>
  <selector xmlns:Android="http://schemas.Android.com/apk/res/Android">  
  <item Android:state_enabled="true" Android:state_pressed="true" Android:drawable="@color/red" />
  <item Android:state_enabled="true" Android:state_focused="true" Android:drawable="@color/red" />
  <item Android:state_enabled="true" Android:state_selected="true" Android:drawable="@color/red" />
  <item Android:drawable="@color/white" />
</selector>
15
ssawchenko

Methode 1:

Aktualisieren Sie ListView in Ihrer XML-Layout-Aktivität/Ihrem Fragment:

<ListView
   ...
   Android:choiceMode="singleChoice"
   Android:listSelector="@Android:color/darker_gray"
/>

Das ist es, du bist fertig! 

Wenn Sie dies programmgesteuert angehen möchten, verwenden Sie Methode 2 ...

Methode 2:  

Wenn Sie ein ListFragment verwenden, können Sie onListItemClick () überschreiben, indem Sie die Ansicht verwenden, um die Farbe festzulegen. Speichern Sie die aktuell ausgewählte Ansicht, um die Farbe der letzten Auswahl zurückzusetzen. 

Bitte beachten Sie, dass dies nur für Listviews funktioniert, die auf einen Bildschirm passen, da die Ansicht erneut verwendet wird.

public class MyListFragment extends ListFragment {
    View previousSelectedItem;
...
    @Override
    public void onListItemClick(ListView parent, View v, int position, long id) {
        super.onListItemClick(parent, v, position, id);
        if (previousSelectedItem!=null) {
            previousSelectedItem.setBackgroundColor(Color.WHITE);
        }
        previousSelectedItem=v;
        v.setBackgroundColor(Color.BLUE);
    }
}
7
JMax

Zuerst können Sie eine Selector-XML-Datei wie folgt in Ihrem Zeichenordner erstellen drawable/list_item_selector.xml

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

    <item Android:state_activated="true">
      <shape Android:shape="rectangle">
        <solid Android:color="#333333" />
        <padding Android:left="5dp" Android:right="5dp" />
      </shape></item>
    <item><shape Android:shape="rectangle">
            <solid Android:color="#222222" />
        </shape></item>

</selector>

Und dann in der Listenansicht den Hintergrund angeben

Android:background="@drawable/list_item_selector"
6
Nirali

Für diejenigen, die sich fragen, was genau getan werden muss, um die Zeilen ausgewählt zu halten, selbst wenn Sie nach oben scrollen. Es ist das state_activated Der Rest wird durch die interne Funktionalität erledigt, Sie müssen sich nicht um das Umschalten kümmern und können mehrere Elemente auswählen. Ich musste keine notifyDataSetChanged () - oder setSelected (true) -Methode verwenden.

Fügen Sie diese Zeile Ihrer Auswahldatei hinzu, für mich drawable\row_background.xml

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

    <item Android:state_enabled="true" Android:state_pressed="true" Android:drawable="@Android:color/holo_blue_light" />
    <item Android:state_enabled="true" Android:state_focused="true" Android:drawable="@Android:color/holo_blue_bright" />
    <item Android:state_enabled="true" Android:state_selected="true" Android:drawable="@Android:color/holo_blue_light" />
    <item Android:state_activated="true" Android:drawable="@Android:color/holo_blue_light" />

    <item Android:drawable="@Android:color/transparent"/>
</selector>

Dann in layout\custom_row.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:padding="10dip"
        Android:background="@drawable/row_background"
        Android:orientation="vertical">
  <TextView
        Android:id="@+id/line1"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content" />
</LinearLayout>

Für weitere Informationen verwende ich dies mit ListView Adapter und verwende myList.setChoiceMode (ListView.CHOICE_MODE_MULTIPLE_MODAL); und myList.setMultiChoiceModeListener (neuer MultiChoiceModeListener () ...

aus diesem Beispiel: http://www.androidbegin.com/tutorial/Android-delete-multiple-selected-items-listview-tutorial/

Sie sollten (sollten) diese Struktur auch für Ihre Listenadapter-Kopplung verwenden: List myList = new ArrayList ();

statt: ArrayList myList = new ArrayList ();

Erläuterung: Typliste vs. Typ ArrayList in Java

5
Emil

verwenden Sie die folgende XML-Datei als Hintergrund für das Listenelement, um alle Probleme zu lösen. Das ausgewählte wird hervorgehoben, obwohl Sie einen Bildlauf durchgeführt haben.

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

Vielen Dank. Nagendra

2

Ich weiß, das ist eine alte Frage, aber ich gebe eine einfache Lösung für dieses Bedürfnis (ohne Schleifen!):

//On your adapter create a variable:
private View lastSelectedItem;

//Define the folowing method:
private void toggleBackgroundItem(View view) {
    if (lastSelectedItem != null) {
        lastSelectedItem.setBackgroundColor(Color.TRANSPARENT);
    }
    view.setBackgroundColor(getResources().getColor(R.color.colorPrimaryDark));
    lastSelectedItem = view;

}
//finally invoque the method onItemClick
lvSac.setOnItemClickListener(new AdapterView.OnItemClickListener()

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

    toggleBackgroundItem(view);
}
}
2
Eumagnun

Der einfachste Weg, den ich gefunden habe:

fügen Sie in Ihrer Aktivität XML folgende Zeilen hinzu:

<ListView 
... 
Android:choiceMode="singleChoice"
Android:listSelector="#666666"
/>

oder programmatisch diese Eigenschaften einstellen:

listView.setSelector(Drawable selector)
listView.setSelector(int resourceId)

Mein besonderes Beispiel:

   <ListView
            Android:choiceMode="singleChoice"
            Android:listSelector="#666666"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:id="@+id/listView"/>

dank an AJG: https://stackoverflow.com/a/25131125/1687010

2
Taochok

Ich mache auch das Gleiche: Markieren Sie den Hintergrund des ausgewählten Listenelements (ändern Sie ihn in Rot) und setzen Sie die Textfarbe innerhalb des Elements auf Weiß. 

Ich kann eine " einfache, aber nicht effiziente " Methode ausdenken: Die Position eines ausgewählten Elements im benutzerdefinierten Adapter beibehalten und in der ListView-OnItemClickListener-Implementierung ändern:

// The OnItemClickListener implementation
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    mListViewAdapter.setSelectedItem(position);
}

// The custom Adapter
private int mSelectedPosition = -1;
public void setSelectedItem (int itemPosition) {
    mSelectedPosition = itemPosition;
    notifyDataSetChanged();
}

Aktualisieren Sie anschließend den Hintergrund und die Textfarbe des ausgewählten Elements in der getView()-Methode.

// The custom Adapter
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ...
    if (position == mSelectedPosition) {
        // customize the selected item's background and sub views
        convertView.setBackgroundColor(YOUR_HIGHLIGHT_COLOR);
        textView.setTextColor(TEXT_COLOR);
    } else {
        ...
    }
}

Nachdem ich eine Weile gesucht hatte, stellte ich fest, dass viele Leute erwähnt hatten, Android:listSelector="YOUR_SELECTOR" zu setzen. Nachdem ich eine Weile versucht hatte, fand ich die einfachste Möglichkeit, den Hintergrund eines ausgewählten ListView-Elements hervorzuheben, indem nur zwei Zeilen für die Layout-Ressource der ListView festgelegt werden:

Android:choiceMode="singleChoice"
Android:listSelector="YOUR_COLOR"

Es gibt auch eine andere Möglichkeit, damit es funktioniert, z. B. das activatedBackgroundIndicator-Design anpassen. Ich denke jedoch, dass dies eine viel allgemeinere Lösung wäre, da dies das gesamte Thema beeinflussen wird.

2
Ethan Zhong

Dies ist eine einfache Methode, die die Auswahl selbst dann erledigt, wenn die Liste lang ist:

public View getView(final int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    Holder holder=new Holder();
    View rowView;
    rowView = inflater.inflate(R.layout.list_item, null);
    //Handle your items.
    //StringHolder.mSelectedItem is a public static variable.
    if(getItemId(position)==StringHolder.mSelectedItem){
        rowView.setBackgroundColor(Color.LTGRAY);

    }else{
        rowView.setBackgroundColor(Color.TRANSPARENT);
    }
    return rowView;
}

Und dann in deinem Onclicklistener:

list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            StringHolder.mSelectedItem = catagoryAdapter.getItemId(i-1);
            catagoryAdapter.notifyDataSetChanged();
.....
1
Wasiun A. Khan

angenommen, Sie möchten, dass jedes Mal ein Element angeklickt wird. Dann funktioniert dieser Code gut. Nehmen wir den Listview-Namen als stlist

stList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        // here i overide the onitemclick method in onitemclick listener
            public void onItemClick(AdapterView<?> parent, View view,
                                int position, long id) {

            //color change
            //selected item colored

            for(int i=0; i<stList.getAdapter().getCount();i++)
            {
                stList.getChildAt(i).setBackgroundColor(Color.TRANSPARENT);
            }

            parent.getChildAt(position).setBackgroundColor(Color.GRAY);

    });
1
Miraj Hamid
View updateview;// above oncreate method
listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);


listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
         if (updateview != null) 
            updateview.setBackgroundColor(Color.TRANSPARENT);
         updateview = view;   

         view.setBackgroundColor(Color.CYAN);
     }
});
0
nandish

Es ist sehr einfach. Verwenden Sie im Konstruktor von "OnItemClick" den Parameter "view", den zweiten, der die Ansicht der listView- oder GridView-Elemente darstellt, und es wird die Ansicht des neuen Elements, die vom adapterView selbst erstellt wird. Um die neue Farbe NUR auf das SELECTED ITEM selbst einzustellen, gehen Sie wie folgt vor:

public void onItemClick(AdapterView<?> adapterView, View view, int i, long l){ //view is instead of the view like textView , ImageView, or whatever view.setBackgroundColor(Color.green); }

Wenn Sie zum Einstellen einer neuen Farbe verschiedene Codes verwenden, werden Sie mit unangenehmen Verhaltensweisen konfrontiert, wenn die grüne Farbe auf das nicht geklickte Element angewendet wird.

In einem ListView-Set:

Android:choiceMode="singleChoice"

Erstellen Sie einen Selektor für einen Hintergrund (drawable/selector_gray.xml):

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:drawable="@color/gray" Android:state_checked="true" />
    <item Android:drawable="@color/white" />
</selector>

Einen Eintrag für eine Liste hinzufügen:

<?xml version="1.0" encoding="utf-8"?>
<TextView
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:gravity="center"
    Android:padding="5dp"
    Android:background="@drawable/selector_gray"
    Android:textColor="@color/colorPrimary"
    tools:text="Your text" />

In einem ViewHolder können Sie dieses Element aufblasen.

0
CoolMind