2010-04-21 7 views

Antwort

6

Das hängt davon ab, was Sie meinen.

Wenn Sie eine echte multi-select Spinner wollen, dann ist nichts in Android dafür gebaut.

Beachten Sie, dass Sie die Kontrolle darüber haben, was in den Spinner Zeilen der Dropdown-Liste mit Ausnahme des Optionsfelds geht. Wenn du Kästchen in deine Reihen setzen willst, sei mein Gast. Es sieht merkwürdig aus, funktioniert möglicherweise nicht richtig in Bezug auf Berührungsereignisse, entfernt die Radioknöpfe (AFAIK) nicht und ist im normalen Modus völlig unabhängig von den Inhalten des Spinner. Daher kann ich diesen Ansatz nicht empfehlen, aber es ist machbar.

Der Quellcode zu Spinner ist im Open-Source-Projekt Android verfügbar. Sie können ihn also gerne klonen und MultiSelectSpinner oder so entwickeln.

+0

Danke! Es scheint, es ist zu viel Mühe, vielleicht werde ich einen anderen Ansatz verwenden. –

2

Sie könnten einfach ein ListView mit Kontrollkästchen erstellen. Sie könnten es sogar zu einem Dialog hinzufügen. Das ist im Wesentlichen alles, was ein Spinner ist.

+0

Schöne Idee! Vielen Dank! –

3

können Sie die multiSpinner verwenden:

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

}

Und dann im 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

Versuchen Sie, diese

<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

habe ich eine dynamische gefüllt Spinner, die ihren Inhalt über die SQLite-Datenbank-Abfrage über den Inhalt Resolver wird, ist es ein Bild anstelle von Text ist, wenn sie geschlossen, es zeigt, was ausgewählt und sein genial einfach :-)

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

     } 

Nun, es sieht aus wie ein einfacher Spinner, was es seine Auswahl zeigen macht diese Linie ist, wird es die Werte füllen und eine radioCheckbox auf der rechten Seite setzen, die oberen /1 Das Element in Ihrer Liste wird vorausgewählt.

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

gibt es mehrere andere vordefinierte Layouts Wich Arbeit ziemlich gut

  • simple_list_item_checked -> zeigt ein Häkchen statt einer RadioButton-
  • simple_list_item_activated_1 oder 2 -> Ändert Background
  • simple_list_item_multiple_choice - > CheckBoxen mit CheckMarks

Hier ist mein Layout, es zeigt ein markiertes oder unmarkiertes Bild (und nicht was ausgewählt ist) daher habe ich R.layout.ghost_text im SpinnerAdapter angegeben.

hier meine onItemSelecte, die die OnItemSelectedListener Interfaces benötigt. Was es tut, verfolgt es mit einem Booleschen, wenn es die Initialisierung des Spinner ist oder nicht. Wenn es einen echten Klick gibt, extrahieren wir die Informationen und aktualisieren ein anderes UI-Element über einen Controller (könnte auch ein Callback sein), wenn das angeklickte Element das Standardauswahlelement ist, setze ich das SpinnerImage nicht ausgewählt, wenn es anders ist als das Standardelement, das ich gesetzt habe Das SpinnerImage ausgewählt.

@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

Es implementiert ein MultiSpinner, können Sie es auf AndroidArsenal finden

Kann es finden auf Maven Repository

Wenn Sie einen Hinweis, um es hinzuzufügen, sieht nett aus: android: Hinweis = "Wählen Sie ... "

Verwandte Themen