动态生成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; } }
关键注意点
- 解决复用问题:在
onBindViewHolder中恢复之前的选中状态,这样RecyclerView滚动时,复用的item能保持正确的选中值。 - 绑定数据而非位置:把选中值存在对应的
Baggage_details对象里,而不是全局列表的固定索引,避免因列表数据变化(比如增删)导致的索引错位。 - 获取所有选中值:调用Adapter的
getAllSelectedValues()方法,就能拿到所有Spinner的选中值列表。
内容的提问来源于stack exchange,提问作者New learner
相关产品推荐
相关产品推荐

