2013-04-02 6 views
6

Ho due filatori che voglio essere "legati" l'uno all'altro in un senso mutuamente esclusivo: se selezioni un oggetto in uno, il testo di quell'articolo diventa rosso e appare in alto, mentre l'altro torna alla visualizzazione della selezione iniziale ("titolo") (se un altro elemento è stato precedentemente selezionato) e il suo testo diventa bianco."Synchronizing" two spinners

questo viene eseguito tramite gli ascoltatori onItemSelected:

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")); 
.... 

e viceversa per la "questione filatrice". Il mio problema è che, se sto passando da uno spinner all'altro e seleziono l'elemento principale, onItemSelectedListener non si registra perché l'elemento selezionato è già selezionato.

Mi è stato detto che questo non è possibile. O, piuttosto, mi è stato detto che è impossibile per un listener onItemSelected attivare un elemento già selezionato. Mentre mi rendo conto che questo è tecnicamente vero, questo problema sembra relativamente semplice e sono sicuro che ci deve essere una soluzione alternativa per produrre l'effetto desiderato.

Ho alcune domande riguardanti alcuni che sto meditando:

  1. C'è un modo per impostare tutti gli elementi in un filatore come non selezionata, mentre ancora la visualizzazione di uno di loro?
  2. Posso utilizzare un diverso tipo di evento (ad esempio "setOnTouchListener", "setOnClickListener", ecc.), Presumibilmente sull'elemento superiore, in combinazione con lo onItemSelectedListener?
  3. Devo utilizzare un diverso tipo di evento da solo, forse sulle Visualizzazioni gonfiate nello stesso filatore, senza lo onItemSelectedListener?
  4. Potete aiutarmi a trovare una strategia migliore di quelle a cui si fa riferimento nei punti elenco sopra?

risposta

1

Invece di utilizzare Spinner, utilizzare uno Button che assomigli visivamente a Spinner non attivo. Quando si fa clic sul pulsante, mostra un numero personalizzato Dialog contenente uno ListView. È possibile utilizzare il metodo setSelection e/o la posizione nello per mostrare quale elemento è attualmente selezionato. Il numero OnItemClickListener di ListView verrà avvisato che è stato fatto clic su qualcosa indipendentemente dal fatto che l'elemento sia stato selezionato o meno.

Quando si trova quale elemento è stato fatto clic, nascondere il Dialog e notificare il pulsante contenente Activity di questo, in modo che possa aggiornare sia Buttons se necessario.

Ho implementato qualcosa di molto simile a questo utilizzando DialogFragments e un DialogFragmentParent e funziona correttamente.

+0

Ma è fondamentale per il design generale di questa app che il menu si apra come uno spinner, cioè che le opzioni scendano. – drewmoore

+0

@drewmore Ho dato una risposta che risolve il problema descritto nella domanda. Per prima cosa ho considerato la sottoclassificazione del 'Spinner' e l'override del metodo responsabile (dove è esplicito che' onItemSelectedListener' non viene chiamato se l'elemento scelto è lo stesso), ma ciò non era possibile, poiché il metodo è privato. Puoi emulare l'animazione se ne hai bisogno così male usando altri mezzi. Tuttavia, se la mia risposta non ti aiuta a causa di alcuni non divulgati nei motivi della domanda, allora dovresti modificare la tua domanda. – Shade

1

Avere si considera qualcosa come di seguito,

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

E per altro

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

e ora

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

    } 
    else{ 
    //update spinner per requirement 
    } 

} 

Si può anche prendere in considerazione alcune variabili aggiuntive o parametri tieni traccia se l'elemento selezionato per la prima volta o meno.

+0

Questo si basa ancora sul listener onItemSelected(), che non si attiva se l'utente seleziona l'elemento che è già in alto. – drewmoore

0

Quindi, è possibile rendere il primo elemento tra i filatori non selezioni valide come "[Scegli uno]" o "[Seleziona titolo]" forzando l'ascoltatore a sparare ogni volta.

Questo avrebbe l'ulteriore vantaggio che saprete che l'utente ha selezionato qualcosa prima del prossimo passaggio.

Naturalmente, ciò dipenderà dal flusso dell'applicazione desiderato.

Problemi correlati