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

动态生成Spinner并添加监听器,获取选中值存入ArrayList的问题

我来帮你解决动态生成Spinner的选中值存储问题~ 首先先把你的Baggage_details类补全(你之前的代码截断了),然后一步步实现监听器绑定和值存储的逻辑:

第一步:完善Baggage_details数据类

我建议给这个类加一个selectedBaggage字段,用来存储对应Spinner的选中值,这样每个Spinner的状态和数据本身绑定,避免复用问题:

public class Baggage_details {
    private String status;
    private String sector_name;
    private String title_count;
    private ArrayList<String> baggage_list;
    private String selectedBaggage; // 新增:存储当前Spinner的选中值

    // 构造函数
    public Baggage_details(String status, String sector_name, String title_count, ArrayList<String> baggage_list) {
        this.status = status;
        this.sector_name = sector_name;
        this.title_count = title_count;
        this.baggage_list = baggage_list;
    }

    // Getter & Setter 全量实现
    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getSector_name() {
        return sector_name;
    }

    public void setSector_name(String sector_name) {
        this.sector_name = sector_name;
    }

    public String getTitle_count() {
        return title_count;
    }

    public void setTitle_count(String title_count) {
        this.title_count = title_count;
    }

    public ArrayList<String> getBaggage_list() {
        return baggage_list;
    }

    public void setBaggage_list(ArrayList<String> baggage_list) {
        this.baggage_list = baggage_list;
    }

    public String getSelectedBaggage() {
        return selectedBaggage;
    }

    public void setSelectedBaggage(String selectedBaggage) {
        this.selectedBaggage = selectedBaggage;
    }
}

第二步:在自定义Adapter中绑定Spinner监听器

假设你用的是RecyclerView.Adapter(如果是BaseAdapter思路完全一致,只是写法略有不同),核心是在onBindViewHolder中给每个Spinner设置监听器,并把选中值存入对应Baggage_details对象的selectedBaggage字段:

public class BaggageAdapter extends RecyclerView.Adapter<BaggageAdapter.ViewHolder> {
    private List<Baggage_details> mBaggageDataList;

    public BaggageAdapter(List<Baggage_details> baggageDataList) {
        this.mBaggageDataList = baggageDataList;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.item_baggage_layout, parent, false); // 替换成你的item布局
        return new ViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        Baggage_details currentItem = mBaggageDataList.get(position);

        // 1. 设置Spinner的数据源
        ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<>(holder.itemView.getContext(),
                android.R.layout.simple_spinner_item, currentItem.getBaggage_list());
        spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        holder.baggageSpinner.setAdapter(spinnerAdapter);

        // 2. 恢复之前的选中状态(解决RecyclerView复用导致的状态丢失)
        if (currentItem.getSelectedBaggage() != null) {
            int selectedIndex = currentItem.getBaggage_list().indexOf(currentItem.getSelectedBaggage());
            if (selectedIndex != -1) {
                holder.baggageSpinner.setSelection(selectedIndex);
            }
        }

        // 3. 设置选中监听器,存储选中值
        holder.baggageSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
                String selectedValue = currentItem.getBaggage_list().get(pos);
                // 把选中值存入当前Baggage_details对象
                currentItem.setSelectedBaggage(selectedValue);
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {
                // 可选:处理未选中的情况,比如设置默认值
                currentItem.setSelectedBaggage("");
            }
        });
    }

    @Override
    public int getItemCount() {
        return mBaggageDataList.size();
    }

    static class ViewHolder extends RecyclerView.ViewHolder {
        Spinner baggageSpinner;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            baggageSpinner = itemView.findViewById(R.id.spinner_baggage); // 替换成你布局中Spinner的id
        }
    }

    // 提供方法获取所有选中值
    public List<String> getAllSelectedValues() {
        List<String> selectedValues = new ArrayList<>();
        for (Baggage_details item : mBaggageDataList) {
            selectedValues.add(item.getSelectedBaggage());
        }
        return selectedValues;
    }
}

关键注意点

  1. 解决复用问题:在onBindViewHolder中恢复之前的选中状态,这样RecyclerView滚动时,复用的item能保持正确的选中值。
  2. 绑定数据而非位置:把选中值存在对应的Baggage_details对象里,而不是全局列表的固定索引,避免因列表数据变化(比如增删)导致的索引错位。
  3. 获取所有选中值:调用Adapter的getAllSelectedValues()方法,就能拿到所有Spinner的选中值列表。

内容的提问来源于stack exchange,提问作者New learner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:21:24