Android Kotlin:如何在Spinner下拉列表中嵌入多个Spinner
实现Spinner下拉面板内嵌Spinner的方法
要实现你需求里这种主Spinner下拉项全是Spinner的效果,核心是自定义Spinner的下拉项布局+自定义Adapter绑定独立数据,具体步骤如下:
1. 定义下拉项的布局文件
创建名为item_nested_spinner_dropdown.xml的布局文件,每个下拉项直接是一个Spinner控件:
<?xml version="1.0" encoding="utf-8"?> <Spinner xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/inner_spinner" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="8dp"/>
2. 编写自定义Adapter
继承BaseAdapter,在getView方法中加载上述布局,同时给每个内嵌Spinner设置专属的选项数据:
public class InnerSpinnerAdapter extends BaseAdapter { private Context mContext; private List<List<String>> mInnerDataList; // 存储每个内嵌Spinner的选项集合 public InnerSpinnerAdapter(Context context, List<List<String>> innerDataList) { mContext = context; mInnerDataList = innerDataList; } @Override public int getCount() { return mInnerDataList.size(); } @Override public Object getItem(int position) { return mInnerDataList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = LayoutInflater.from(mContext).inflate(R.layout.item_nested_spinner_dropdown, parent, false); holder = new ViewHolder(); holder.innerSpinner = convertView.findViewById(R.id.inner_spinner); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } // 给当前位置的内嵌Spinner绑定专属数据 List<String> innerData = mInnerDataList.get(position); ArrayAdapter<String> innerAdapter = new ArrayAdapter<>(mContext, android.R.layout.simple_spinner_item, innerData); innerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); holder.innerSpinner.setAdapter(innerAdapter); // 可选:给内嵌Spinner添加选中事件监听 holder.innerSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int innerPosition, long id) { String selectedValue = innerData.get(innerPosition); // 这里可根据需求处理选中后的逻辑,比如记录选中值 } @Override public void onNothingSelected(AdapterView<?> parentView) {} }); return convertView; } static class ViewHolder { Spinner innerSpinner; } }
3. 在页面中配置主Spinner
准备好每个内嵌Spinner的选项数据,给主Spinner设置自定义Adapter:
public class MainActivity extends AppCompatActivity { private Spinner mMainSpinner; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mMainSpinner = findViewById(R.id.main_spinner); // 准备每个内嵌Spinner的独立选项数据 List<List<String>> innerDataList = new ArrayList<>(); innerDataList.add(Arrays.asList("Profile 1 Option 1", "Profile 1 Option 2", "Profile 1 Option 3")); innerDataList.add(Arrays.asList("Profile 2 Option A", "Profile 2 Option B")); innerDataList.add(Arrays.asList("Profile 3 X", "Profile 3 Y", "Profile 3 Z", "Profile 3 W")); // 绑定自定义Adapter到主Spinner InnerSpinnerAdapter adapter = new InnerSpinnerAdapter(this, innerDataList); mMainSpinner.setAdapter(adapter); // 设置主Spinner的提示文本(对应你图里的"Choose Profile") mMainSpinner.setPrompt("Choose Profile"); } }
注意事项
- 内嵌Spinner的点击事件不会和主Spinner冲突,下拉面板展开后,触摸事件会正常传递给子Spinner
- 如果需要自定义主Spinner的默认显示样式,可重写Adapter的
getDropDownView方法,或者单独给主Spinner设置显示布局
内容的提问来源于stack exchange,提问作者oyeraghib
相关产品推荐
相关产品推荐

