使用ArrayAdapter的Android Spinner关闭后再打开丢失item内边距问题
Spinner二次展开后Item内边距丢失解决方案
问题根因
该问题为部分Android系统版本(Android 5.0~8.0之间的部分原生及定制ROM)的已知兼容性问题:Spinner的下拉列表控件DropDownListView在第二次及之后复用Item视图时,会强制覆写Item根布局的padding属性为列表全局padding值,导致自定义布局中设置的padding失效。
解决方案(按实施优先级排序)
方案1:显式指定下拉项布局(优先使用,改动最小)
ArrayAdapter默认会将构造方法中传入的布局同时作为选中项布局和下拉项布局,但部分系统版本下拉渲染时会读取默认的下拉布局属性覆盖原有配置,显式调用setDropDownViewResource指定布局即可规避该问题,修改后的初始化代码如下:
ArrayAdapter<String> adapter = new ArrayAdapter<>(mContext, R.layout.item_simple_spinner, typeArray); // 显式指定下拉项使用的布局,和选中项布局保持一致即可 adapter.setDropDownViewResource(R.layout.item_simple_spinner); binding.fragmentTypeSpinner.setAdapter(adapter);
方案2:Item布局嵌套一层外层容器
如果方案1无效,可将自定义Item的padding从TextView移到外层嵌套的ViewGroup上,DropDownListView只会修改Item直接根View的属性,嵌套后内层的视图样式不会被系统重置,修改后的item_simple_spinner.xml代码如下:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp" android:background="@color/colorTransparent"> <TextView android:id="@+id/item_simple_text_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="17sp" /> </LinearLayout>
方案3:自定义ArrayAdapter强制设置样式
如果上述两种方案均不生效,可重写ArrayAdapter的getDropDownView方法,每次渲染下拉项时手动设置padding,从代码层面强制覆盖系统的修改:
public class CustomSpinnerAdapter extends ArrayAdapter<String> { private int padding; public CustomSpinnerAdapter(@NonNull Context context, int resource, @NonNull List<String> objects) { super(context, resource, objects); padding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, context.getResources().getDisplayMetrics()); } @NonNull @Override public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { View view = super.getDropDownView(position, convertView, parent); // 手动设置内边距 view.setPadding(padding, padding, padding, padding); return view; } }
初始化时改用自定义Adapter即可:
binding.fragmentTypeSpinner.setAdapter(new CustomSpinnerAdapter(mContext, R.layout.item_simple_spinner, typeArray));
内容的提问来源于stack exchange,提问作者Tango Bloom
相关产品推荐
相关产品推荐

