it-swarm.com.de

Markieren Sie das ausgewählte Element in ListView auf Android

Ich habe eine Anwendung erstellt, die mit ListViews in Android funktioniert, und ich kann sie nicht so erstellen, dass das ausgewählte (chacked) Element einen anderen Hintergrund hat. Ich verwende CHOICE_MODE_SINGLE. So sieht mein Code bisher aus:


Die ListView, die ich verwende:
(in 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>

Das TextView-Layout, das ich im Adapter verwende:
( 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" />

Hier füge ich den Adapter hinzu:

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 sicher, dass das richtige Element beim Klicken überprüft wird, da beim Aufruf von getCheckedItemPosition () der richtige Wert zurückgegeben wird.


Und nun die zwei Dinge, die ich versucht habe, um das markierte Objekt hervorzuheben:


Wahlschalter gezeichnet:
( 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 hinzu:

Android:listSelector="@drawable/selector_test"

Hintergrund gezeichnet:
( 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 hinzu:

Android:background="@drawable/background_test"

Ich habe versucht, den Selektor und den Hintergrund sowohl in listView.xml als auch in listItem.xml hinzuzufügen. Die einzige Änderung ist jedoch die Standardhintergrundfarbe und die Farbe des Selektors, wenn das Element gedrückt (oder gehalten) wird.
Android: state_checked = "true" und Android: state_selected = "true" scheinen nichts zu tun.

Ich kann den Hintergrund ändern, indem ich die getView () - Methode in ArrayAdapter überschreibe und setBackgroundColor () darin aufrufe, wenn die Ansicht ausgewählt ist und der Hintergrund geändert wird, der Selektor jedoch vollständig entfernt wird. Ich mag es auch nicht wirklich, Klassen zu überschreiben, nur um eine Codezeile zu ändern, insbesondere wenn das gleiche auf eine andere Weise erreicht werden kann.

Ich frage also, gibt es eine Möglichkeit, ein markiertes Element in ListView hervorzuheben, indem Sie einen Auswahlbereich oder Hintergrund hinzufügen, der gezeichnet werden kann, und ich mache es einfach falsch, oder muss es anders funktionieren .

Danke im Voraus! :)

8
Velja

fügen Sie diese Zeile bei Start Ihrer Aktivität hinzu

lv.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

dabei ist lv eine Instanz von listView

überschreiben Sie dann 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();

}

Ändern Sie dann die Farbe des Hintergrunds des zuvor ausgewählten Elements in der getView-Methode Ihres benutzerdefinierten Adapters auf normal

8

Versuche dies:

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>
5
Luc

Verwenden Sie programmgesteuert setSelector. Zum Beispiel:

lv.setSelector(R.color.abc_background_cache_hint_selector_material_dark);

Legen Sie den Artikelstatus im Selector folgendermaßen fest:

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:state_activated="true"
        Android:color="@color/XXX/>
</selector>

Ich weiß nicht warum state_checked nicht funktioniert. Zuerst dachte ich, es muss ein Checkableview sein, dann habe ich CheckedTextView ausprobiert. Funktioniert immer noch nicht.
Jedenfalls wird state_activated das Problem lösen.

0
limmeng

Nach einigen Stunden, in denen ich eine Störung nach der anderen traf (einschließlich des Auswählers, der einen schmutzigen Streifen hinterließ), entschied ich mich, es selbst zu tun:

class MyListAdapter extends ArrayAdapter<MyData> {
    // !!! access to the current selection
    int mSelected = 0;
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View v =  super.getView(position, convertView, parent);
        // !!! this is where the selected item is highlighted
        v.findViewById(R.id.selectionSign).setVisibility(position == mSelected ? View.VISIBLE : View.INVISIBLE);
        return v;
    }
    public CommandListAdapter(Context context, List<MyData> objects) {
        super(context, R.layout.mylistitem, R.id.mytext, objects);
    }
}

mit dem OnItemClickListener:

        mMyListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                setSelectionPosNoUpd(position);
                update();
            }
        });

und die Funktionen definiert als:

    void setSelectionPosNoUpd(int n) {
        mCommandListAdapter.mSelected = n;
        //update();
    }
    void update() {
        mListViewOfCommands.smoothScrollToPosition(getSelectionPos());
        mCommandListAdapter.notifyDataSetChanged();
    }

und das Listenelement XML ( res/layout/mylistitem.xml ) lautet:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    >
    <LinearLayout
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:orientation="vertical" >
        <TextView
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:id="@+id/mytext" 
        />
    </LinearLayout>
    <View
        Android:id="@+id/selectionSign"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:background="#10ff5000"
        Android:visibility="invisible"
        />
</FrameLayout>

Der Nachteil ist, dass ich nach dem Ändern der Auswahl update () : keine einfache Möglichkeit habe, die zuvor hervorgehobene Ansicht aufzuheben.