一、基础使用流程
1. XML 布局声明
<Spinner
android:id="@+id/spinner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:entries="@array/spinner_items" <!-- 静态数据源(可选) -->
/>
-
静态数据源:在
res/values/arrays.xml定义选项:<string-array name="spinner_items"> <item>北京</item> <item>上海</item> <item>广州</item> </string-array>
2. Java 初始化与适配器设置
Spinner spinner = findViewById(R.id.spinner);
// 动态数据源(List 或数组)
List<String> dataList = new ArrayList<>();
dataList.add("选项1");
dataList.add("选项2");
// 创建适配器
ArrayAdapter<String> adapter = new ArrayAdapter<>(
this,
android.R.layout.simple_spinner_item, // 默认项布局
dataList
);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); // 下拉项布局
spinner.setAdapter(adapter);
二、事件监听
监听用户选择并获取选中项:
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
String selectedItem = parent.getItemAtPosition(position).toString();
Toast.makeText(MainActivity.this, "选中: " + selectedItem, Toast.LENGTH_SHORT).show();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
// 无选择时触发
}
});
三、样式定制
1. 自定义项布局
-
创建布局文件
res/layout/custom_spinner_item.xml:<TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/text1" android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="#FF0000" android:padding="10dp"/> -
应用自定义布局:
ArrayAdapter<String> adapter = new ArrayAdapter<>( this, R.layout.custom_spinner_item, // 自定义布局 dataList ); adapter.setDropDownViewResource(R.layout.custom_spinner_item); // 下拉项同布局
2. 修改背景与箭头
-
定义背景 Drawable
res/drawable/spinner_bg.xml:<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" android:drawable="@color/blue" /> <item android:drawable="@color/white" /> </selector> -
XML 中应用:
<Spinner android:background="@drawable/spinner_bg" android:popupBackground="#FFFFFF" android:spinnerMode="dialog" <!-- 对话框模式 --> />
四、高级功能
1. 动态更新数据
// 添加新选项
dataList.add("新增选项");
adapter.notifyDataSetChanged(); // 刷新适配器
// 删除选项
dataList.remove(0);
adapter.notifyDataSetChanged();
2. 自定义适配器(复杂数据)
public class CustomAdapter extends BaseAdapter {
private List<Item> items; // Item 含图标+文本
private Context context;
public CustomAdapter(Context context, List<Item> items) {
this.context = context;
this.items = items;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.custom_item, parent, false);
}
ImageView icon = convertView.findViewById(R.id.icon);
TextView text = convertView.findViewById(R.id.text);
icon.setImageResource(items.get(position).getIconId());
text.setText(items.get(position).getText());
return convertView;
}
// 其他方法:getCount(), getItem(), getItemId()
}
使用:
List<Item> itemList = new ArrayList<>();
itemList.add(new Item(R.drawable.ic_beijing, "北京"));
CustomAdapter adapter = new CustomAdapter(this, itemList);
spinner.setAdapter(adapter);
五、注意事项与优化
-
性能优化
-
大量数据:避免直接加载,改用分页或搜索过滤 。
-
复用视图:在
getView()中复用convertView。
-
-
常见问题
-
默认选中:首次加载会触发
onItemSelected,需忽略初始调用 。 -
Fragment 中使用:在
onCreateView()初始化 。
-
-
模式选择
android:spinnerMode="dropdown" <!-- 下拉模式(默认) --> android:spinnerMode="dialog" <!-- 对话框模式 -->
六、完整示例代码
public class MainActivity extends AppCompatActivity {
private Spinner spinner;
private ArrayAdapter<String> adapter;
private List<String> dataList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
spinner = findViewById(R.id.spinner);
dataList.add("北京");
dataList.add("上海");
// 适配器
adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, dataList);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
// 事件监听
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
if (position > 0) { // 忽略初始触发
Toast.makeText(MainActivity.this, "选中: " + dataList.get(position), Toast.LENGTH_SHORT).show();
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {}
});
}
}
总结:
-
基础场景:静态数据 →
android:entries+ArrayAdapter。 -
动态数据:
List+notifyDataSetChanged()。 -
复杂UI:自定义
BaseAdapter+ 布局文件 。 -
避坑:对话框模式 (
spinnerMode="dialog") 适合选项过多场景
387

被折叠的 条评论
为什么被折叠?



