How To Change The Position Of Opened Spinner?
I would like the spinner dropdown to open right below the spinner itself. E.g.: How can i set the position of spinner dropdown?
Solution 1:
Declare the spinner mode as a dropdown:
android:spinnerMode="dropdown"
then use the vertical offset to close the gap:
android:dropDownVerticalOffset="-15dp"
Solution 2:
You have to extend Spinner and change the location of AlertDialog (spinner when clicked acts as alertDialog).
Code (does a bit more than just position, it also sets background for opened spinner):
publicclassCustomSpinnerextendsSpinner {
privateAlertDialog mPopup;
publicCustomSpinner(Context context) {
super(context);
}
publicCustomSpinner(Context context, AttributeSet attrs) {
super(context, attrs);
}
publicCustomSpinner(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@OverrideprotectedvoidonAttachedToWindow() {
super.onAttachedToWindow();
}
@OverrideprotectedvoidonDetachedFromWindow() {
super.onDetachedFromWindow();
if (mPopup != null && mPopup.isShowing()) {
mPopup.dismiss();
mPopup = null;
}
}
//when clicked alertDialog is made@OverridepublicbooleanperformClick() {
Context context = getContext();
AlertDialog.Builder builder = newAlertDialog.Builder(context);
CharSequence prompt = getPrompt();
if (prompt != null) {
builder.setTitle(prompt);
}
mPopup = builder.setSingleChoiceItems(
newDropDownAdapter(getAdapter()),
getSelectedItemPosition(), this).show();
WindowManager.LayoutParamsWMLP = mPopup.getWindow().getAttributes();
//width and height must be set to anything other than WRAP_CONTENT!WMLP.x = 0; // x positionWMLP.y = 50; // y positionWMLP.height =390 ; //LayoutParams.WRAP_CONTENWMLP.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'sViewParent parent = listView.getParent();
while (parent != null && parent instanceofView) {
((View) parent).setBackgroundDrawable(null);
parent = parent.getParent();
}
returntrue;
}
@OverridepublicvoidonClick(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>
*/
privatestaticclassDropDownAdapterimplementsListAdapter, SpinnerAdapter {
privateSpinnerAdapter mAdapter;
/**
* <p>Creates a new ListAddapter wrapper for the specified adapter.</p>
*
* @param adapter the Adapter to transform into a ListAdapter
*/publicDropDownAdapter(SpinnerAdapter adapter) {
this.mAdapter = adapter;
}
public int getCount() {
return mAdapter == null ? 0 : mAdapter.getCount();
}
publicObjectgetItem(int position) {
return mAdapter == null ? null : mAdapter.getItem(position);
}
public long getItemId(int position) {
return mAdapter == null ? -1 : mAdapter.getItemId(position);
}
publicViewgetView(int position, View convertView, ViewGroup parent) {
returngetDropDownView(position, convertView, parent);
}
publicViewgetDropDownView(int position, View convertView, ViewGroup parent) {
return mAdapter == null ? null :
mAdapter.getDropDownView(position, convertView, parent);
}
publicbooleanhasStableIds() {
return mAdapter != null && mAdapter.hasStableIds();
}
publicvoidregisterDataSetObserver(DataSetObserver observer) {
if (mAdapter != null) {
mAdapter.registerDataSetObserver(observer);
}
}
publicvoidunregisterDataSetObserver(DataSetObserver observer) {
if (mAdapter != null) {
mAdapter.unregisterDataSetObserver(observer);
}
}
/**
* <p>Always returns false.</p>
*
* @returnfalse
*/publicbooleanareAllItemsEnabled() {
returntrue;
}
/**
* <p>Always returns false.</p>
*
* @returnfalse
*/publicbooleanisEnabled(int position) {
returntrue;
}
public int getItemViewType(int position) {
return0;
}
public int getViewTypeCount() {
return1;
}
publicbooleanisEmpty() {
returngetCount() == 0;
}
}
}
Then you just gotta insert it to your layout with "yourPackage.CustomSpinner" element like:
<yourPackage.CustomSpinner
android:layout_height="wrap_content"
android:id="@+id/spinner"
android:layout_width="fill_parent">
</yourPackage.CustomSpinner>
Solution 3:
For dropdown Spinner mode you can use this:
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);
}
}
});
This set vertical offset of dropdown by spinner height.
Post a Comment for "How To Change The Position Of Opened Spinner?"