2013-10-04 12 views
8

Ho un ListView con checkbox:onCheckedChanged sparato più volte, ListView con checkbox

  1. Oncheckedchanged(..) viene chiamato quando controllo utente/item deselezionare il listview
  2. OncheckedChanged(..) chiamato di nuovo quando l'utente clicca il listitem via onItemClick(.....)

Si tratta di un problema noto? come differenziare gli eventi.

public View getView(int position, View convertView, ViewGroup parent) { 

ViewHolder viewHolder = null; 
if (convertView == null) { 
    LayoutInflater inflator = context.getLayoutInflater(); 
    convertView = inflator.inflate(R.layout.row, null); 
    viewHolder = new ViewHolder(); 
    viewHolder.text = (TextView) convertView.findViewById(R.id.label); 
    viewHolder.checkbox = (CheckBox) convertView.findViewById(R.id.check); 
    viewHolder.imageview= (ImageView) convertView.findViewById(R.id.imageView1); 
    viewHolder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

       @Override 
       public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
        int getPosition = (Integer) buttonView.getTag(); // Here we get the position that we have set for the checkbox using setTag. 
        list.get(getPosition).setSelected(buttonView.isChecked()); // Set the value of checkbox to maintain its state. 
       } 
      }); 
    convertView.setTag(viewHolder); 
    convertView.setTag(R.id.label, viewHolder.text); 
    convertView.setTag(R.id.check, viewHolder.checkbox); 
    convertView.setTag(R.id.imageView1, viewHolder.imageview); 

} else { 
    viewHolder = (ViewHolder) convertView.getTag(); 
} 
viewHolder.checkbox.setTag(position); // This line is important. 
viewHolder.imageview.setTag(position); 
viewHolder.text.setText(list.get(position).getName()); 
viewHolder.checkbox.setChecked(list.get(position).isSelected()); 


//  change the default-image here 
if(list.get(position).getcontact_id()==5) 
{ 
    viewHolder.imageview.setImageResource(android.R.drawable.ic_dialog_map); 
}... 
.. 


return convertView; 
} 

EDIT

onCheckedChanged() viene chiamato

  1. Una volta, quando alcuna voce vengono selezionati e utente fa clic sulla casella di controllo
  2. Se la lista è composta da 3 elementi e quando l'utente clicca su qualsiasi altro elemento, onItemclick() viene richiamato e onCheckedChanged() viene generato 3 volte (= no: di elementi nella listview)
+0

Sarebbe bello se potessimo vedere il codice ... –

+0

quale parte del codice-. onclickitem() o customadapter? – user755

+0

Penso che il luogo in cui stai impostando il tuo 'OnCheckChangedListener' sarebbe bello da vedere ... – Darwind

risposta

6

Questo è un comportamento previsto:

  • onCheckedChanged(CompoundButton buttonView, boolean isChecked) è chiamato per ogni oggetto, ogni volta che vengono controllati/incontrollato. Android ha deciso di monitorare lo stato di tutti gli articoli per te e ti chiama per ogni articolo ogni volta che è stato modificato. Con il parametro isChecked puoi distinguere cosa è successo.

  • onItemClick() viene chiamato ogni volta che uno degli elementi su cui si fa clic - non è necessariamente la casella di controllo all'interno dell'oggetto, ma da qualche parte. Di solito l'articolo viene selezionato in seguito - di nuovo, non sempre.

  • Se avete bisogno di sapere quale voce in realtà è stato selezionato dalla visualizzazione elenco, utilizzare OnItemSelectedListener.onItemSelected(). Questo è quello chiamato per ottenere la selezione (tutto l'articolo).

BTW: Non è necessario prrammare manualmente il comportamento di una casella di controllo. Il check/deselezionare e il disegno del segno di spunta nella casella è fatto da Android. Hai solo bisogno di ottenere lo stato controllato una volta che sai quale è stato selezionato. Quindi l'implementazione onCheckedChanged non è affatto necessaria per quanto posso vedere.

+1

+1 Buona risposta dato che è giusto ... MA Android ha deciso SBAGLIATO! È stupido e incoerente ... Altri componenti compensano le variazioni di valore tramite codice (barra di avanzamento, o almeno in ascolto nell'ascoltatore), altri componenti come lo Spinner, il callback onItemSelected compensano anche la selezione del nodo selezionato. – TacB0sS

13

Sostituire onCheckChangeListener in onClickListener.

Il checkChanged verrà chiamato due volte come verrà chiamato quando si chiama il metodo setChecked() e quando si fa clic sulla casella di controllo.

+0

Questo è il consiglio migliore !! – TacB0sS

+2

ma se si modifica lo stato di controllo senza fare clic, come con una semplice trascinamento, questo non verrà chiamato. puoi controllare te stesso –

Problemi correlati