2013-10-04 9 views
8

Mam ListView z wyboru:onCheckedChanged opalane wiele razy, Listview z wyboru

  1. Oncheckedchanged(..) jest wywoływana, gdy kontrola użytkownika/odznacz punkt pogrupowanych
  2. OncheckedChanged(..) nazywa się ponownie, gdy użytkownik kliknij listitem poprzez onItemClick(.....)

Czy to znany problem? jak rozróżnić wydarzenia.

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() jest wywoływana

  1. Raz, kiedy wybiera się żaden element, a użytkownik kliknie pole
  2. Jeśli lista składa się z 3 elementów i gdy użytkownik kliknij na jakichkolwiek innych elementach wywoływana jest funkcja onItemclick() i onCheckedChanged() jest uruchamiany 3 razy (= nie: elementów w widoku list)
+0

Byłoby wspaniale, gdybyśmy mogli zobaczyć twój kod ... –

+0

która część kodu-. onclickitem() lub customadapter? – user755

+0

Myślę, że miejsce, w którym ustawiasz 'OnCheckChangedListener' byłoby miło zobaczyć ... – Darwind

Odpowiedz

6

To jest oczekiwane zachowanie:

  • onCheckedChanged(CompoundButton buttonView, boolean isChecked) nazywany jest dla każdego elementu, gdy są one zaznaczone/odznaczone. Android postanowił śledzić stan wszystkich elementów i dzwonił do każdego elementu za każdym razem, gdy został zmieniony. Dzięki parametrowi isChecked możesz rozróżnić, co się stało.

  • onItemClick() jest wywoływana za każdym razem, gdy jeden z przedmiotów, gdzie kliknięto - niekoniecznie jest polem wyboru w elemencie, ale gdzieś. Zazwyczaj przedmiot jest wybierany później - znowu, nie zawsze.

  • Jeśli potrzebujesz wiedzieć, który element był rzeczywiście wybrany z widoku listy, użyj OnItemSelectedListener.onItemSelected(). To jest ten, który został wezwany, by uzyskać wybór (cały przedmiot).

BTW: Nie trzeba ręcznie prgram zachowania pola wyboru. Zaznaczenie/odznaczenie i rysowanie zaznaczenia w polu odbywa się przez Androida. Musisz tylko uzyskać status sprawdzenia, gdy wiesz, który został wybrany. Tak więc implementacja onCheckedChanged nie jest wcale konieczna, o ile widzę.

+1

+1 Dobra odpowiedź, ponieważ to prawda ... ALE Android zdecydował NIEPRAWDA! To głupie i niespójne ... Pozostałe komponenty rekompensują zmiany wartości za pomocą kodu (pasek postępu, lub przynajmniej w odbiorniku), inne komponenty, takie jak Spinner, wywołanie onItemSelected, również rekompensują wybór wybranego węzła. – TacB0sS

13

Zamień właściwość onCheckChangeListener na onClickListener.

Kontrolka checkChanged zostanie wywołana dwukrotnie, ponieważ zostanie wywołana, gdy zadzwonisz do metody setChecked() i po kliknięciu pola wyboru.

+0

To jest lepsza rada !! – TacB0sS

+2

ale jeśli zmienisz status sprawdzania bez kliknięcia, na przykład z małym małym przeciągnięciem, to nie zadzwonisz. możesz sprawdzić siebie. –