2013-02-26 17 views
11

C'è un modo per cancellare l'elemento selezionato in un controllo ListView?Cancella selezione SingleChoiceVisualizzazione selezione

Il ListView è definita in questo modo:

<ListView 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:minHeight="50dp" 
    android:id="@+id/example_list" 
    android:layout_weight="2" 
    android:choiceMode="singleChoice"/> 

ed è riempito con un adattatore personalizzato.

L'opzione selezionata viene evidenziata tramite un selettore:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_pressed="true" > 
    <shape> 
     <gradient 
     android:startColor="#3E5260" 
     android:endColor="#3E5260" 
     android:angle="270" /> 
    </shape> 
    </item> 
    <item android:state_activated="true"> 
    <shape> 
     <gradient 
     android:startColor="#3E5260" 
     android:endColor="#3E5260" 
     android:angle="270" /> 
    </shape> 
    </item> 
</selector> 

Ora quello che davvero è 2 ListViews in una singola attività e quando un elemento è
selezionato in una ListView voglio deselezionare la voce in l'altro ListView.

Entrambi ListViews sollevano il seguente gestore quando un elemento viene cliccato:

void DeviceList_Click(object sender, EventArgs e) 
{ 
    //easy enough to check which ListView raised the event 
    //but then I need to deselect the selected item in the other listview 
} 

Ho provato cose come:

exampleList.SetItemChecked(exampleList.SelectedItemPosition, false); 

e

exampleList.SetSelection(-1); 

Ma questo non sembra lavorare.

risposta

25

Utilizzando listView.SetItemChecked(-1, true); funziona bene qui.

Qui è la mia attività ho provato con:

SetContentView(Resource.Layout.Main); 
var listView = FindViewById<ListView>(Resource.Id.listView); 
_listAdapter = new CustomListAdapter(this); 
listView.Adapter = _listAdapter; 

var button = FindViewById<Button>(Resource.Id.removeChoice); 
button.Click += (sender, args) => listView.SetItemChecked(-1, true); 

Main.axml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 
    <ListView 
    android:id="@+id/listView" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:choiceMode="singleChoice" 
    /> 
    <Button 
    android:id="@+id/removeChoice" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="remove choice" 
    /> 
</LinearLayout> 
+0

Sembra funzionare, non l'ho provato, grazie – TimothyP

+0

Che cos'è => notazione? Non ho mai visto quello usato nel codice di Android. –

+0

@IgorGanapolsky È un'espressione lambda, un metodo anonimo. Questo è C#. In Java hai le implementazioni 'IOnClickListener'. – Cheesebaron

15

Usa clearChoices() per cancellare lo stato controllato di tutti gli elementi in una lista

+1

Ho provato anche quello, ma non sembra funzionare (si noti che sto usando Mono per Android) – TimothyP

+10

Sembra che si dovrebbe chiamare adapter.notifyDataSetChanged() dopo questo per farlo funzionare. – pvshnik

+0

Questo non funziona per un ListFragment. –

2

sue opere semplice per me:

ListView listView = (ListView) findViewById(R.id.idMyListView); 
     listView.clearFocus(); 
+5

Perché clearFocus() cancella un ListView a scelta singola? Non ha senso. –

2

Si tratta di una vecchia questione, ma solo nel caso in cui qualcun altro ne abbia bisogno in futuro, in base alla risposta @Cheesebaron, ecco cosa ho fatto:

Su ogni ListViews' OnItemClickListener impostare l'altro elemento della lista controllato su false:

list1.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View view, int pos, long id) { 
      list2.setItemChecked(list2.getSelectedItemPosition(), false); 
     } 
}); 

Questa implementazione è in Java, ma se si ottiene la logica qui è possibile implementare in C# pure. Spero che questo ti aiuti.

Problemi correlati