2010-03-03 11 views

Odpowiedz

0

Jeśli ktoś napotka na to pytanie, może warto zajrzeć pod numer a related question I asked a while ago, który zawiera kilka odpowiedzi z dobrymi pomysłami dotyczącymi obejścia tego problemu.

+0

Mam inny problem z słuchaczem. jeśli uruchamiam zadanie asynchroniczne z metody OnItemSelected, a następnie obracam wartość getunast getLastNonConfigurationInstance null dla zadania, które zapisuję w onRetainNonConfigurationInstance. Ale jeśli wstawię kod na zewnątrz w oncreate, to będzie dobrze działać ... – Maxrunner

+0

nie powiedziałeś, że wskazujesz nam również 2 swoją odpowiedź. – cosmincalistru

+3

@cosmincalistru: Naprawiono link - właśnie skopiowałem wklejono adres URL mojej przeglądarki, nie zdawałem sobie sprawy, że to była odpowiedź zamiast pytania. Być może, z czasem, wybiorę się. –

1

Nie należy próbować uniemożliwić połączenia z numerem OnItemSelectedListener.

Domyślnie Android Spinners wybiera pierwszą pozycję zwróconą przez adapter, dlatego też wywoływana jest funkcja OnItemSelectedListener, która uruchamia pewne działanie dla tego elementu.

Zalecam, aby pierwszy element w swojej Spinner Adapter był pustym przedmiotem, a Twój OnItemSelectedListener może zignorować ten pusty przedmiot w oparciu o jego identyfikator.

2

Oto moje rozwiązanie.

Muszę zignorować pierwsze zdarzenie wyboru pozycji, ponieważ istnieje zależność między urządzeniem Route Grade Spinner a polem wyboru trasy.

Wszystkie ustawienia są konfigurowane na podstawie poprzedniej wizyty w działaniu.

// Used to count the number of times the onItemSelected gets fired 
private int mGradeSelectionCount = 0; 

private void attachHandlers() { 
    OnItemSelectedListener gradeRangeSelectionMadeListener; 
    gradeRangeSelectionMadeListener = new OnItemSelectedListener() { 
     @Override 
     public void onItemSelected(AdapterView<?> adapter, View view, int position, long id) { 
      // If the counter is 0 then we can assume that it is android firing the event 
      if (mGradeSelectionCount++ < 1) { 
       return; 
      } 
      if (mCmbGradeFrom.getSelectedItemPosition() == 0) { 
       // Uncheck the Route checkbox 
       mChkTypeRoute.setChecked(false); 
      } else { 
       // Check the Route checkbox 
       mChkTypeRoute.setChecked(true); 
      } 
     } 
     @Override 
     public void onNothingSelected(AdapterView<?> arg0) { 
      // Dont care, keep the same values as before 

     } 
    }; 
    mCmbGradeFrom.setOnItemSelectedListener(gradeRangeSelectionMadeListener); 
    mChkTypeRoute.setOnCheckedChangeListener(new OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      if (!isChecked) { 
       mCmbGradeFrom.setSelection(0); 
       mCmbGradeTo.setSelection(0); 
      } 
     } 
    }); 
} 
1

To może pomóc.

@Override 
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) 
{ 
    if(view!=null && view.getId()!=0){ 
     //do your code here to avoid callback twice 
    } 
} 
+0

Nie działa :-( – sourcerebels

0

Dobrze myślę Znalazłem ładne rozwiązanie dla mnie, miałem go w głowie od początku, ale ... mam zwyczaj klasy otoki oparty na Androidzie Handler, która jest wywoływana DoLater, a także istnieje zwyczaj Adapter na podstawie Listenera, więc nie możesz skopiować wkleić to, ale otrzymasz pomysł. Niebezpieczne jest to, że w jakiś sposób opóźnienie 500 może trwać długo, a widok może być już zniszczony (gdy użytkownik szybko coś załatwia lub telefon się powoli ...), więc DoLater dba o to, aby nie był wywoływany, gdy aktywność nie zostanie wznowiona. Ale w ten sposób OnItemSelectedListener nie jest uruchamiany przy tworzeniu.

public void onResume() { 
    super.onResume(); 
    new DoLater(this, 500) { 
       public void run() { 
        new OnSpinnerSelectedAdapter(getBowSpinner()) { 
         protected void onItemSelected(int position) { 
          onBowSelected(position); 
         } 
        }; 
       } 
      }; 
} 
Powiązane problemy