Android: Destaque item selecionado em ListView

? Velja @ | Original: StackOverFlow
---

Tenho vindo a fazer um aplicativo que funciona com ListViews em Android, e eu não posso fazê-lo assim que o ( chacked ) item selecionado tem um fundo diferente. Estou usando CHOICE_MODE_SINGLE . Isto é como meu código parece até agora:

O ListView que eu uso : ( dentro 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>

O layout TextView eu uso o adaptador : ( 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" />

Este é o lugar onde eu adiciono o adaptador:

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);
    }
});

Tenho certeza de que o item correto é verificada no clique, porque quando eu chamo getCheckedItemPosition (), ele retorna o valor adequado .

E agora, as duas coisas que eu tentei, a fim de destacar o item verificado:

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>

Eu adicioná-lo ao .xml com :

android:listSelector="@drawable/selector_test"

Background drawable : ( 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>

Eu adicioná-lo ao .xml com :

android:background="@drawable/background_test"

Eu tentei adicionar o seletor eo fundo para ambos listView.xml e listItem.xml, mas a única coisa que muda é a cor de fundo padrão, e a cor do selector quando o item é pressionado ( ou mantido ) . android: state_checked = "true" e android: state_selected = "true" parecem não fazer nada. Eu posso mudar o fundo, substituindo o método getView () in ArrayAdapter e invocando SetBackgroundColor ( ) nele se a vista é selecionado, e que o faz mudar o fundo, mas também se livrar do selector inteiramente. Além disso, eu realmente não gosto de substituir aulas apenas para mudar uma linha de código, especialmente se a mesma coisa pode ser feita de uma forma diferente. Então o que eu estou pedindo é, existe uma maneira de destacar item selecionado em ListView, adicionando um selector ou fundo drawable para ele, e eu apenas estou fazendo errado, ou será que eu tenho que fazê-lo funcionar de outra maneira. Desde já, obrigado! :)

---

Top 5 Responder

1Ravinder Bhandari @

adicione esta linha em onStart de sua atividade

lv.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

onde lv é instância de listView

em seguida, substituir esse método e adicione as seguintes linhas a ele.

 @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();

}

e, em seguida, alterar a cor de fundo anterior do item selecionado de volta ao normal no método getView do seu adaptador de costume

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 @

Eu acho que voce não pode usar mListView dentro classe anônima . Você deve usar AdapterView arg0

mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

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

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

        }
    });