Android : Highlight ausgewählte Element im Listview-

? Velja @ | Original: StackOverFlow
---

Ich habe einen Antrag, der mit Listviews in Android arbeitet, und ich kann nicht machen es so, dass die gewählte ( chacked ) Artikel hat einen anderen Hintergrund. Ich bin mit CHOICE_MODE_SINGLE . Dies ist, wie mein Code sieht so weit :

Das Listview, die ich benutze : (innen layout.xml )

<ListView
    android:id="@+id/listView"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:choiceMode="singleChoice"
    android:listSelector="@drawable/selector_test" >
</ListView>

Die Textview- Layout, die ich in den Adapter : ( listItem.xml )

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/listItem"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textSize="23sp"
    android:textStyle="bold" />

Dies ist, wo ich fügen Sie den Adapter :

mListAdapter = new ArrayAdapter<String>(this, R.layout.listItem, mList);
mListView = (ListView) findViewById(R.id.listView);
mListView.setAdapter(mAuthorAdapter);
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
        String selected = mList.get(position);
        // ...
        mListView.setItemChecked(position, true);
    }
});

Ich bin mir sicher, dass der richtige Artikel auf Klick aktiviert ist, weil, wenn ich rufe getCheckedItemPosition (), den richtigen Wert zurück .

Und jetzt sind die beiden Dinge, die ich versucht, um die geprüft zu markieren :

Selector drawable : ( selector_test.xml )

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" android:enterFadeDuration="@android:integer/config_longAnimTime">

    <item android:state_checked="true"><shape>
            <solid android:color="@color/red" />
        </shape></item>
    <item android:state_selected="true"><shape>
            <solid android:color="@color/blue" />
        </shape></item>
    <item android:state_pressed="true"><shape>
            <solid android:color="@color/green" />
        </shape></item>

</selector>

Ich füge es mit .xml :

android:listSelector="@drawable/selector_test"

Hintergrund ziehfähig : ( background_test.xml )

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

    <item android:drawable="@color/red" android:state_checked="true"/>
    <item android:drawable="@color/blue" android:state_selected="true"/>
    <item android:drawable="@color/green"/>

</selector>

Ich füge es mit .xml :

android:background="@drawable/background_test"

Ich habe versucht, das Hinzufügen des Wählers und der Hintergrund sowohl listView.xml und listItem.xml, aber das einzige was sich ändert, ist die Standard- Hintergrundfarbe und die Farbe des Wahl, wenn das Element gedrückt wird ( oder statt ) . Android: state_checked = "true" und Android: state_selected = "true" scheinen, nichts zu tun . Ich kann den Hintergrund durch Überschreiben der getView () -Methode in Arrayadapter und Aufrufen setBackgroundColor () in es, wenn die Ansicht ausgewählt ist zu ändern, und es macht die Hintergrund, aber auch wird der Schalt vollständig zu befreien. Auch glaube ich nicht wirklich gerne Klassen überschreiben, nur um eine Zeile Code zu ändern, vor allem, wenn das gleiche kann auf unterschiedliche Weise erreicht werden. Also, was ich will ist zu fragen, ist es eine Möglichkeit zu überprüfen Element im Listview, indem Sie einen Selektor oder Hintergrund ziehfähig, um es zu markieren, und ich bin nur etwas falsch, oder muss ich, damit es funktioniert auf eine andere Weise . Vielen Dank im Voraus! :)

---

Top 5 Antwort

1Ravinder Bhandari @

fügen Sie diese Zeile in onStart Ihrer Tätigkeit

lv.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

wo lv ist Instanz listview

dann überschreiben diese Methode und fügen Sie die folgenden Zeilen hinzu .

 @Override
public void onListItemClick(ListView l, View v, int position, long id) {


    // Set the item as checked to be highlighted 
    lv.setItemChecked(position, true);
            v.setBackgroundColor(Color.BLUE);

        conversationAdapter.notifyDataSetChanged();

}

und ändern Sie die Farbe des Hintergrundes vorherigen Menüelement ist wieder normal in getView Methode Ihres benutzerdefinierten Adapter

2Jack Duong @

Try this:

listViewDay.setItemChecked(position, true);
listViewDay.setSelection(position);

listitem.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="40dp"
    android:background="@drawable/list_day_selector" >

    <TextView
        android:id="@+id/txtItemDay"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:gravity="center_vertical|center_horizontal"
        android:text="22"
        android:textColor="@android:color/white"
        android:textSize="22sp" />

</LinearLayout>

list_selector.xml

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

    <item android:drawable="@drawable/list_item_bg_normal" android:state_activated="false"/>
    <item android:drawable="@drawable/bg_with_left_arrow" android:state_pressed="true"/>
    <item android:drawable="@drawable/bg_with_left_arrow" android:state_activated="true"/>

</selector>
3Rafael Ruiz Tabares @

Ich glaube, Sie cann't mListView innerhalb anonymen Klasse zu verwenden. Sie müssen AdapterView arg0 verwenden

mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View view,
                int position, long id) {
            AnyObject obj=(AnyObject)arg0.getItemAtPosition(position);

                            ........
                            .........
                            .........

        }
    });