2010-04-21 12 views

cevap

6

Ne demek istediğine bağlı.

Gerçek bir çoklu seçim için Spinner isterseniz, bunun için Android'de yerleşik hiçbir şey yoktur.

Radyo düğmesi dışında, aşağı açılır listenin Spinner satırında ne olup bittiğini kontrol edeceğinizi unutmayın. Satırlara onay kutularını koymak isterseniz, konuğum ol. Garip görünecek, dokunma olaylarıyla ilgili olarak düzgün çalışmayabilir, radyo düğmelerini (AFAIK) çıkarmayacak ve Spinner'un içeriği normal modda tamamen ilgisiz olacaktır. Bu yüzden, bu yaklaşımı tavsiye edemiyorum, ancak yapılabilir.

Spinner kaynak koduna Android açık kaynak kodundan ulaşabilirsiniz, bu sayede kopyalamak ve MultiSelectSpinner veya başka bir şey geliştirmek için bekliyoruz.

+0

Teşekkürler! Çok fazla sorun gibi görünüyor, belki başka bir yaklaşım kullanacağım. –

2

Sadece bir listView onay kutuları ile oluşturabilirsiniz. Bir diyaloğa bile ekleyebilirsiniz. Bu aslında tüm bir spinner.

+0

Güzel fikir! Teşekkürler! –

3

Sen multiSpinner kullanabilirsiniz: Sonra

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

}

Ve düzen .xml içinde:

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

bu

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

Spinner1Activity.javadeneyin Seçilen neyin 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
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 

} 
} 

Göründüğünü, dinamik kapatıldığında içerik Resolverde üzerinde SQLite Veritabanı sorgunun üzerine içeriğini alır Spinner, bu metin yerine bir görüntü var doldurdu yarattı ve o değerleri dolduracaktır, onun seçimi bu çizgidir gösterip, sağ tarafta üstünü bir radioCheckbox koymak kılan onun müthiş basit :-)

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

     } 

Şimdi, basit bir Spinner benziyor, /1 inci Listenizdeki öğe önceden seçilecektir.

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

orada birkaç diğer önceden tanımlanmış düzenleri oldukça iyi iş otelimizden olan

  • simple_list_item_checked -> BackgroundColor
  • simple_list_item_multiple_choice değiştirir -> yerine RadioButton
  • simple_list_item_activated_1 veya 2'nin bir onay işareti gösterir - > CheckBox'lar checkMarks ile

Burada benim düzenim, işaretli veya işaretsiz bir Görüntü (seçili değil) gösterir, bu nedenle ben spinnerAdapter içinde R.layout.ghost_text belirtmişimdir.OnLtemSelectedListener Arabirimleri'ni gerektiren onItemSelecte burada. Ne yaparsa, bu, eğer bir spinerin başlamasıysa, bir boole ile devam eder. Eğer gerçek bir tıklama varsa, bu bilgiyi seçip standart bir eleman olarak belirlediyse, Tıklanan Elemanın Standart Seçilmiş Öğe'yi seçtiğimde SpinnerImage seçilmemişse, bir Kontrolör üzerinden başka bir UI Elementi güncellemek (ayrıca bir geri arama da olabilir). spinnerImage seçildi.

@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

Orada, buna bir ipucu eklerseniz

Maven Repository

üzerinde bulabilir miyim AndroidArsenal

üzerinde bulabilirsiniz, bir MultiSpinner uygulanan güzel görünüyor edilir: android: ipucu = "Seç ... "