You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 18:25:34