2013-04-02 22 views
6

Mam dwa obrotnice, które chcę "związać" ze sobą w sensie wzajemnie wykluczającym się: jeśli wybierzesz przedmiot w jednym, tekst tego przedmiotu zmieni kolor na czerwony i pojawi się u góry, a drugi powraca do wyświetlania początkowego ("tytułowego") wyboru (jeśli wcześniej wybrano inny element), a jego tekst zmienia kolor na biały."Synchronizacja" dwóch spinnerów

To wszystko odbywa się za pośrednictwem onItemSelected słuchaczy:

sectionSpin.setOnItemSelectedListener(new OnItemSelectedListener() { 
     @Override 
     public void onItemSelected(AdapterView<?> parent, View arg1, 
       int position, long arg3) {    
      issueSpin.setSelection(0);          
      ((TextView) issueSpin.getChildAt(0)).setTextColor(Color.parseColor("#FFFFFF")); 
      ((TextView) arg1).setTextColor(Color.parseColor("#E3170D")); 
.... 

i vice versa dla "spinner emisyjnej". Mój problem polega na tym, że jeśli przechodzę z jednego pokrętła do drugiego i wybieram najwyższy element, to onItemSelectedListener nie rejestruje się, ponieważ wybrany element jest już wybrany.

Powiedziano mi, że nie jest to możliwe. Lub raczej powiedziano mi, że nie jest możliwe, aby obiekt nasłuchujący onItemSelected uruchomił element, który jest już wybrany. Chociaż zdaję sobie sprawę, że jest to prawdą techniczną, problem ten wydaje się stosunkowo prosty i jestem pewien, że musi istnieć obejście, aby uzyskać pożądany efekt.

Mam kilka pytań dotyczących niektórych, że mam rozważała:

  1. Czy istnieje jakiś sposób, aby ustawić wszystkie elementy w turbinki jak zaznaczone, jednocześnie wyświetlając jedną z nich?
  2. Czy mogę użyć innego rodzaju zdarzenia (np. "SetOnTouchListener", "setOnClickListener" itp.), Prawdopodobnie na górnym elemencie, w połączeniu z onItemSelectedListener?
  3. Czy powinienem sam używać innego rodzaju zdarzenia, być może w Widoku napompowanym samodzielnie, bez numeru onItemSelectedListener?
  4. Czy możesz mi pomóc znaleźć lepszą strategię niż te, o których mowa w punktach powyżej?

Odpowiedz

1

Zamiast używać , należy użyć Button, który wizualnie przypomina nieaktywny Spinner. Po kliknięciu przycisku pokaż niestandardową Dialog zawierającą ListView. Możesz użyć metody setSelection i/lub pozycji w Adapter 's getView, aby pokazać, który element jest aktualnie wybrany. ListView 's OnItemClickListener otrzyma powiadomienie, że coś zostało kliknięte, niezależnie od tego, czy element został wybrany, czy nie.

Gdy znajdziesz przedmiot, który został kliknięty, ukryć Dialog i powiadomić Activity tego, tak, że można go aktualizować w razie potrzeby zarówno Buttons zawierający guziki.

Zaimplementowałem coś bardzo podobnego do tego przy użyciu DialogFragments i DialogFragmentParent i działa dobrze.

+0

Jednak dla ogólnego projektu tej aplikacji kluczowe znaczenie ma to, że menu otwiera się jak spinner - tzn. Że opcje są opuszczane. – drewmoore

+0

@dniej podałem odpowiedź, która rozwiązuje opisany problem w pytaniu. Najpierw rozważyłem podklasę "Spinnera" i nadpisanie odpowiedzialnej metody (gdzie jest jasne, że 'onItemSelectedListener' nie jest wywoływany, jeśli wybrany element jest taki sam), ale to nie było możliwe, ponieważ metoda jest prywatna. Możesz emulować animację, jeśli jej tak potrzebujesz, używając innych metod. Jeśli jednak moja odpowiedź nie pomoże Ci z powodu pewnych nieujawnionych w pytaniu powodów, powinieneś edytować swoje pytanie. – Shade

1

Czy uważają Państwo, coś jak poniżej,

sectionSpin.setOnItemSelectedListener(new OnItemSelectedListener() { 
    @Override 
    public void onItemSelected(AdapterView<?> parent, View arg1, 
      int position, long arg3) { 
     updateView("sectionSpin"); 
    } 
} 

I druga

issueSpin.setOnItemSelectedListener(new OnItemSelectedListener() { 
    @Override 
    public void onItemSelected(AdapterView<?> parent, View arg1, 
      int position, long arg3) { 
     updateView("issueSpin"); 
    } 
} 

i teraz

private void updateView(String spinner){ 
    if (spinner.equals(sectionSpin)){ 
     //update spinner per requirement 

    } 
    else{ 
    //update spinner per requirement 
    } 

} 

Można również rozważyć pewne dodatkowe zmienne lub parametry do śledzić, czy pozycja wybrana po raz pierwszy, czy nie.

+0

Wciąż opiera się na detektorze onItemSelected(), który nie uruchamia się, jeśli użytkownik wybierze element, który jest już na górze. – drewmoore

0

Można więc ustawić pierwszy element w spinnerach jako nieważne wybory, takie jak "[wybierz jeden]" lub "[Wybierz tytuł]", zmuszając słuchacza do strzelania za każdym razem.

To przyniesie dodatkową korzyść, o której wiesz, że użytkownik wybrał coś przed następnym krokiem.

Oczywiście zależy to od pożądanego przepływu aplikacji.