2011-05-06 32 views

Respuesta

4

Tiene que extender Spinner y cambiar la ubicación de AlertDialog (spinner cuando hace clic actúa como alertaDialog).

de código (no un poco más que sólo la posición, sino que también establece fondo para spinner abierto):

public class CustomSpinner extends Spinner { 

private AlertDialog mPopup; 

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

public CustomSpinner(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

public CustomSpinner(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
} 

@Override 
protected void onAttachedToWindow() { 
    super.onAttachedToWindow(); 
} 

@Override 
protected void onDetachedFromWindow() { 
    super.onDetachedFromWindow(); 

    if (mPopup != null && mPopup.isShowing()) { 
     mPopup.dismiss(); 
     mPopup = null; 
    } 
} 


//when clicked alertDialog is made 
@Override 
public boolean performClick() { 
    Context context = getContext(); 

    AlertDialog.Builder builder = new AlertDialog.Builder(context); 
    CharSequence prompt = getPrompt(); 
    if (prompt != null) { 
     builder.setTitle(prompt); 
    } 



    mPopup = builder.setSingleChoiceItems(
      new DropDownAdapter(getAdapter()), 
      getSelectedItemPosition(), this).show(); 

    WindowManager.LayoutParams WMLP = mPopup.getWindow().getAttributes(); 

      //width and height must be set to anything other than WRAP_CONTENT! 
    WMLP.x = 0; // x position 
    WMLP.y = 50; // y position 
    WMLP.height =390 ; //LayoutParams.WRAP_CONTEN 
    WMLP.width = 315; 
    WMLP.horizontalMargin = 0; 
    WMLP.verticalMargin = 0; 

    mPopup.getWindow().setAttributes(WMLP); 



    //ListView.getDefaultSize(size, measureSpec) 
    ListView listView = mPopup.getListView(); 
    //listView.set 
    // Remove divider between rows 
    listView.setDivider(null); 

    // Set custom background 
    listView.setBackgroundResource(R.drawable.drop); 

    // Remove background from all (grand)parent's 
    ViewParent parent = listView.getParent(); 
    while (parent != null && parent instanceof View) { 
     ((View) parent).setBackgroundDrawable(null); 

     parent = parent.getParent(); 
    } 

    return true; 
} 

@Override 
public void onClick(DialogInterface dialog, int which) { 
    setSelection(which); 
    dialog.dismiss(); 
    mPopup = null; 
} 


* <p>Wrapper class for an Adapter. Transforms the embedded Adapter instance 
* into a ListAdapter.</p> 
*/ 
private static class DropDownAdapter implements ListAdapter, SpinnerAdapter { 
    private SpinnerAdapter mAdapter; 

    /** 
    * <p>Creates a new ListAddapter wrapper for the specified adapter.</p> 
    * 
    * @param adapter the Adapter to transform into a ListAdapter 
    */ 
    public DropDownAdapter(SpinnerAdapter adapter) { 
     this.mAdapter = adapter; 
    } 

    public int getCount() { 
     return mAdapter == null ? 0 : mAdapter.getCount(); 
    } 

    public Object getItem(int position) { 
     return mAdapter == null ? null : mAdapter.getItem(position); 
    } 

    public long getItemId(int position) { 
     return mAdapter == null ? -1 : mAdapter.getItemId(position); 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     return getDropDownView(position, convertView, parent); 
    } 

    public View getDropDownView(int position, View convertView, ViewGroup parent) { 
     return mAdapter == null ? null : 
       mAdapter.getDropDownView(position, convertView, parent); 
    } 

    public boolean hasStableIds() { 
     return mAdapter != null && mAdapter.hasStableIds(); 
    } 

    public void registerDataSetObserver(DataSetObserver observer) { 
     if (mAdapter != null) { 
      mAdapter.registerDataSetObserver(observer); 
     } 
    } 

    public void unregisterDataSetObserver(DataSetObserver observer) { 
     if (mAdapter != null) { 
      mAdapter.unregisterDataSetObserver(observer); 
     } 
    } 

    /** 
    * <p>Always returns false.</p> 
    * 
    * @return false 
    */ 
    public boolean areAllItemsEnabled() { 
     return true; 
    } 

    /** 
    * <p>Always returns false.</p> 
    * 
    * @return false 
    */ 
    public boolean isEnabled(int position) { 
     return true; 
    } 

    public int getItemViewType(int position) { 
     return 0; 
    } 

    public int getViewTypeCount() { 
     return 1; 
    } 

    public boolean isEmpty() { 
     return getCount() == 0; 
    } 

    } 
    } 

A continuación, sólo tiene que insertar a su diseño con el elemento "yourPackage.CustomSpinner" como:

<yourPackage.CustomSpinner 
    android:layout_height="wrap_content" 
    android:id="@+id/spinner" 
    android:layout_width="fill_parent"> 
</yourPackage.CustomSpinner> 
25

declarar el modo spinner como un desplegable:

android:spinnerMode="dropdown" 

a continuación, utilizar El desplazamiento vertical para cerrar la brecha:

android:dropDownVerticalOffset="-15dp" 

Spinner Android Documentation

+2

¿Cómo supiste usar -15dp? –

+1

Eso es un número mágico, me temo. Deberá usar prueba y error para obtener el número correcto/buscar su implementación. – Tr0yJ

+0

Gracias amigo, realmente funcionó para mí ... –

0

Para desplegable modo Spinner puede utilizar esto:

mSortingSpinner.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
     mSortingSpinner.setDropDownVerticalOffset(
       mSortingSpinner.getDropDownVerticalOffset() + mSortingSpinner.getHeight()); 
     if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) { 
      mSortingSpinner.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
     } else { 
      mSortingSpinner.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
     } 
    } 
}); 

Este conjunto de desplazamiento vertical desplegable por la altura spinner.

Cuestiones relacionadas