2010-04-21 9 views

Respuesta

6

Eso depende de a qué te refieras.

Si quiere una verdadera selección múltiple Spinner, entonces no hay nada integrado en Android para eso.

Tenga en cuenta que tiene el control sobre lo que se incluye en las filas Spinner de la lista desplegable, excepto el botón de opción. Si quiere poner casillas de verificación en sus filas, sea mi invitado. Se verá extraño, puede que no funcione correctamente con respecto a los eventos táctiles, no eliminará los botones de radio (AFAIK) y no tendrá ninguna relación con los contenidos del Spinner en modo normal. Por lo tanto, no puedo recomendar este enfoque, pero es factible.

El código fuente Spinner está disponible en el proyecto de código abierto de Android, por lo que le invitamos a clonarlo y desarrollar un MultiSelectSpinner o algo así.

+0

Gracias! Parece que es demasiado problema, tal vez usaré otro enfoque. –

2

Puede crear un ListView con casillas de verificación. Incluso podría agregarlo a un diálogo. Eso es esencialmente todo lo que es un spinner.

+0

¡Buena idea! ¡Gracias! –

3

Puede utilizar el 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); 
} 

}

Y luego, en su diseño .xml:

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

probar este

<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

creé una dinámica llena Spinner que recibe su contenido a través de la consulta de bases de datos SQLite sobre el sistema de resolución de contenido, que es una imagen en lugar de texto cuando está cerrado, muestra cuál es seleccionada , y su impresionante :-) sencilla

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

     } 

Ahora, parece que un simple Spinner, lo que hace que se muestre su selección es esta línea, llenará los valores y poner un radioCheckbox en el lado derecho, la parte superior/1ra El elemento en su lista será preseleccionado.

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

hay varios otros diseños predefinidos Wich trabajo bastante bien

  • simple_list_item_checked -> muestra una marca de verificación en lugar de un RadioButton
  • simple_list_item_activated_1 o 2 -> Cambia BackgroundColor
  • simple_list_item_multiple_choice - > CheckBoxes con checkMarks

para completar aquí está mi diseño, muestra una imagen marcada o no marcada (y no está seleccionada), por lo tanto, especifiqué R.layout.ghost_text en 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" /> 

aquí mi onItemSelecte que necesita las interfaces OnItemSelectedListener. Lo que hace, mantiene un seguimiento con un booleano si es la inicialización de la ruleta o no. Si hay un clic real, extraemos la información y actualizamos otro Elemento UI sobre un Controlador (también podría ser una devolución de llamada) si el Elemento Pulsado es el Elemento Seleccionado Estándar configuro el SpinnerImage no seleccionado, si es otro, entonces el elemento estándar que configuro la imagen de spinner seleccionada.

@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

se implementa un MultiSpinner, se puede encontrar en AndroidArsenal

lo encuentro en Maven Repository

Si añade un toque a él, se ve bien: androide: pista = "Elija ... "

Cuestiones relacionadas