2010-04-21 17 views

risposta

6

Dipende da cosa intendi.

Se si desidera una vera selezione multipla Spinner, non c'è nulla di integrato in Android per questo.

Nota che hai il controllo su ciò che entra nelle righe Spinner dell'elenco a discesa, ad eccezione del pulsante di opzione. Se vuoi mettere le checkbox nelle tue file, sii mio ospite. Sembrerà strano, potrebbe non funzionare correttamente rispetto agli eventi di tocco, non rimuoverà i pulsanti di opzione (AFAIK) e sarà completamente estraneo al contenuto di Spinner nella modalità normale. Quindi, non posso raccomandare questo approccio, ma è fattibile.

Il codice sorgente a Spinner è disponibile dal progetto open source Android, quindi siete invitati a clonarlo e sviluppare uno MultiSelectSpinner o qualcosa del genere.

+0

Grazie! Sembra che sia troppo disturbo, forse userò un altro approccio. –

2

Si potrebbe semplicemente creare un controllo ListView con caselle di controllo. Potresti anche aggiungerlo a una finestra di dialogo. Questo è essenzialmente tutto uno spinner.

+0

Bella idea! Grazie! –

3

È possibile utilizzare il multiSpinner:

import java.util.List; 

import android.app.AlertDialog; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.DialogInterface.OnCancelListener; 
import android.content.DialogInterface.OnMultiChoiceClickListener; 
import android.util.AttributeSet; 
import android.widget.ArrayAdapter; 
import android.widget.Spinner; 

public class MultiSpinner extends Spinner implements OnMultiChoiceClickListener, OnCancelListener { 

    private List<String> items; 
    private boolean[] selected; 
    private String defaultText; 
    private MultiSpinnerListener listener; 

    public MultiSpinner(Context context) { 
    super(context); 
} 

public MultiSpinner(Context arg0, AttributeSet arg1) { 
    super(arg0, arg1); 
} 

public MultiSpinner(Context arg0, AttributeSet arg1, int arg2) { 
    super(arg0, arg1, arg2); 
} 

@Override 
public void onClick(DialogInterface dialog, int which, boolean isChecked) { 
    if (isChecked) 
     selected[which] = true; 
    else 
     selected[which] = false; 
} 

@Override 
public void onCancel(DialogInterface dialog) { 
    // refresh text on spinner 
    StringBuffer spinnerBuffer = new StringBuffer(); 
    boolean someUnselected = false; 
    for (int i = 0; i < items.size(); i++) { 
     if (selected[i] == true) { 
      spinnerBuffer.append(items.get(i)); 
      spinnerBuffer.append(", "); 
     } else { 
      someUnselected = true; 
     } 
    } 
    String spinnerText; 
    if (someUnselected) { 
     spinnerText = spinnerBuffer.toString(); 
     if (spinnerText.length() > 2) 
      spinnerText = spinnerText.substring(0, spinnerText.length() - 2); 
    } else { 
     spinnerText = defaultText; 
    } 
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(getContext(), 
      android.R.layout.simple_spinner_item, 
      new String[] { spinnerText }); 
    setAdapter(adapter); 
    listener.onItemsSelected(selected); 
} 

@Override 
public boolean performClick() { 
    AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); 
    builder.setMultiChoiceItems(
      items.toArray(new CharSequence[items.size()]), selected, this); 
    builder.setPositiveButton(R.string.ok, 
      new DialogInterface.OnClickListener() { 

       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        dialog.cancel(); 
       } 
      }); 
    builder.setOnCancelListener(this); 
    builder.show(); 
    return true; 
} 

public void setItems(List<String> items, String allText, 
    MultiSpinnerListener listener) { 
    this.items = items; 
    this.defaultText = allText; 
    this.listener = listener; 

    // all selected by default 
    selected = new boolean[items.size()]; 
    for (int i = 0; i < selected.length; i++) 
     selected[i] = true; 

    // all text on the spinner 
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(getContext(), 
      android.R.layout.simple_spinner_item, new String[] { allText }); 
    setAdapter(adapter); 
} 

public interface MultiSpinnerListener { 
    public void onItemsSelected(boolean[] selected); 
} 

}

E poi nel layout .xml:

<xxx.xx.gui.MultiSpinner android:id="@+id/SpinnerCollegues" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:prompt="@string/university"/> 
5

Prova questa

<selva.spinner.multispinner android:id="@+id/multi_spinner" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" /> 

Spinner1Activity.java

package selva.spinner; 

    import java.util.ArrayList; 
    import java.util.List; 
    import selva.spinner.multispinner.multispinnerListener; 
    import android.app.Activity; 
    import android.os.Bundle; 

    public class Spinner1Activity extends Activity implements multispinnerListener 
    { 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    multispinner ms = (multispinner) findViewById(R.id.multi_spinner); 
    List<String> list = new ArrayList<String>(); 
    list.add("one"); 
    list.add("two"); 
    list.add("three"); 
    list.add("four"); 
    list.add("five"); 
    list.add("six"); 
    list.add("seven"); 
    list.add("eight"); 
    list.add("nine"); 
    list.add("ten"); 
    ms.setItems(list, "select", this); 

    } 

@Override 
public void onItemschecked(boolean[] checked) 
{ 
    // TODO Auto-generated method stub 

} 
} 

multispinner.java

package selva.spinner; 

import java.util.List; 
import android.app.AlertDialog; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.DialogInterface.OnCancelListener; 
import android.content.DialogInterface.OnMultiChoiceClickListener; 
import android.util.AttributeSet; 
import android.widget.ArrayAdapter; 
import android.widget.Spinner; 


public class multispinner extends Spinner implements 
OnMultiChoiceClickListener, OnCancelListener 
{ 
     private List<String> listitems; 
     private boolean[] checked; 

     public multispinner(Context context) 
     { 
      super(context); 
     } 

     public multispinner(Context arg0, AttributeSet arg1) 
     { 
      super(arg0, arg1); 
     } 

     public multispinner(Context arg0, AttributeSet arg1, int arg2) 
     { 
      super(arg0, arg1, arg2); 
     } 

     @Override 
     public void onClick(DialogInterface dialog, int ans, boolean isChecked) 
     { 
      if (isChecked) 
       checked[ans] = true; 
      else 
       checked[ans] = false; 
     } 


    @Override 
     public void onCancel(DialogInterface dialog) 
     { 

     String str="Selected values are: "; 

      for (int i = 0; i < listitems.size(); i++) 
      { 
         if (checked[i] == true) 
         { 
         str=str+" "+listitems.get(i); 
         } 

      } 

       AlertDialog.Builder alert1 = new AlertDialog.Builder(getContext()); 

       alert1.setTitle("Items:"); 

       alert1.setMessage(str); 

       alert1.setPositiveButton("Ok", null); 

       alert1.show(); 


     } 

     @Override 
     public boolean performClick() 
     { 
      AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); 
      builder.setMultiChoiceItems(
        listitems.toArray(new CharSequence[listitems.size()]), checked, this); 
      builder.setPositiveButton("done", 
        new DialogInterface.OnClickListener() 
      { 

       @Override 
       public void onClick(DialogInterface dialog, int which) 
       { 
        dialog.cancel(); 
       } 
      }); 
      builder.setOnCancelListener(this); 
      builder.show(); 
      return true; 
     } 

     public void setItems(List<String> items, String allText, 
       multispinnerListener listener) 
     { 
      this.listitems = items; 

      checked = new boolean[items.size()]; 
      for (int i = 0; i < checked.length; i++) 
       checked[i] =false; 


      ArrayAdapter<String> adapter = new ArrayAdapter<String>(getContext(), 
        android.R.layout.simple_spinner_item, new String[] { allText }); 
      setAdapter(adapter); 
     } 

     public interface multispinnerListener 
     { 
      public void onItemschecked(boolean[] checked); 
     } 

} 
0

ho creato una dinamica piena Spinner che prende il contenuto tramite la query database SQLite sul resolver contenuti, si tratta di un'immagine al posto del testo quando è chiuso, si vede che cosa è selezionato , e la sua semplice :-) impressionante

 spinnerFavorites = (SpinnerMultiSameClick) v.findViewById(R.id.guide_btn_favorites); 
     spinnerFavorites.setOnItemSelectedListener(this);  
     ContentResolver resolver = activity.getContentResolver(); 
     String[] projection = new String[] { DataContract.Favorites.FAVORITES_ID, DataContract.Favorites.NAME }; 

     Cursor cursor = resolver.query(DataContract.Favorites.CONTENT_URI, projection, null, null, DataContract.Favorites.FAVORITES_ID +" ASC"); 
     if (cursor.getCount() > 0) { 
      // create an array to specify which fields we want to display 
      String[] from = new String[] { DataContract.Favorites.NAME, DataContract.Favorites.FAVORITES_ID }; 
      // create an array of the display item we want to bind our data 
      // to 
      int[] to = new int[] { android.R.id.text1, android.R.id.text2 }; 
      SimpleCursorAdapter adapter = new SimpleCursorAdapter(activity, R.layout.ghost_text, cursor, from, to, 
        SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER); 

      // get reference to our spinner 
      spinner.setAdapter(adapter); 

      adapter.setDropDownViewResource(android.R.layout.simple_list_item_single_choice); 


     } else { 
      // TODO: Maybe button to make new favList    
      spinnerFavorites.setVisiblity(View.GONE); 

     } 

Ora, sembra che una semplice Spinner, ciò che lo rende mostrare la sua scelta è questa linea, si riempirà i valori e mettere un radioCheckbox sul lato destro, la parte superiore/1 ° L'elemento nella tua lista sarà preselezionato.

adapter.setDropDownViewResource(android.R.layout.simple_list_item_single_choice); 

ci sono molti altri layout predefiniti Quale lavoro abbastanza bene

  • simple_list_item_checked -> mostra un segno di spunta invece di un RadioButton
  • simple_list_item_activated_1 o 2 -> Cambia BackgroundColor
  • simple_list_item_multiple_choice - > CheckBoxes con checkMarks

per completare qui è il mio layout, mostra un'immagine marcata o non marcata (e non quello che è stato selezionato) quindi ho specificato R.layout.ghost_text nel spinnerAdapter.

 <com.netstream.ch.tv.android.ui.program.guide.land.SpinnerMultiSameClick 
     android:id="@+id/guide_btn_favorites" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="5dp" 
     android:layout_marginRight="5dp" 
     android:background="@drawable/icon_selector_guide_filter_favorites" 
     android:clickable="true" /> 

qui il mio onItemSelecte che necessita delle interfacce OnItemSelectedListener. Quello che fa, tiene traccia con un booleano se è l'inizializzazione dello spinner o meno. Se c'è un clic reale, estraiamo le informazioni e aggiorniamo un altro elemento dell'interfaccia utente su un controller (potrebbe anche essere un callback) se l'elemento cliccato è l'elemento standard selezionato, non lo seleziono, se è altro che l'elemento standard che ho impostato l'immagine del filatore selezionata.

@Override 
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { 

    if (parent.getId() == R.id.guide_btn_favorites) { 

     if (!AbsintheViewControllerFactory.getGuideController().isFavoriteListInitialisation()) { 
      Cursor c = (Cursor) parent.getItemAtPosition(pos); 
      String favid = c.getString(c.getColumnIndexOrThrow(DataContract.Favorites.FAVORITES_ID)); 
      String name = c.getString(c.getColumnIndexOrThrow(DataContract.Favorites.NAME)); 
      Log.d(TAG, "Set Filter to FavListId: " + favid + " by its name: " + name); 
      if (favid.equalsIgnoreCase(GuideViewController.allChannelsFavoritesIdentifier)) { 
       spinnerFavorites.setSelected(false); 
      } else { 
       spinnerFavorites.setSelected(true); 
      } 
      AbsintheViewControllerFactory.getGuideController().setFavourites(favid); 

      guideInfoSelectedFavoriteList.setText(name); 
     } else { 
      AbsintheViewControllerFactory.getGuideController().setFavoriteListInitialisation(false); 
      guideInfoSelectedFavoriteList.setText(getActivity().getResources().getString(R.string.FILTER_FAVORITE_ALL_CHANNELS)); 
     } 
    } 
} 
1

C'è implementato un MultiSpinner, si può trovare su AndroidArsenal

può trovare su Maven Repository

Se si aggiunge un accenno ad esso, sembra piacevole: Android: suggerimento = "Scegli ... "

Problemi correlati