Android Studio Java中Spinner向Firestore传递错误字段问题
解决Spinner显示名称但提交对应链接到Firestore的问题
核心问题分析
现有代码存在两个关键问题:
- 重复设置Spinner适配器,最终导致Spinner显示的是链接而非名称
- 使用两个独立List存储名称和链接,无法关联选中项对应的链接内容
解决方案及修改代码
通过创建自定义数据类封装名称与链接的关联关系,让Spinner显示名称的同时,能轻松获取对应链接:
public class CreateData extends AppCompatActivity { EditText League, Team1, Team2, Tip; MaterialButton Registerbtn; FirebaseFirestore db; // 自定义数据类,绑定名称和对应链接 static class ImageItem { private String name; private String picLink; public ImageItem(String name, String picLink) { this.name = name; this.picLink = picLink; } public String getName() { return name; } public String getPicLink() { return picLink; } // 重写toString,让Spinner默认显示名称 @Override public String toString() { return name; } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_create_data); db = FirebaseFirestore.getInstance(); League = findViewById(R.id.league); Team1 = findViewById(R.id.team1); Team2 = findViewById(R.id.team2); Tip = findViewById(R.id.tip); Registerbtn = findViewById(R.id.btnRegister); Spinner spinner = findViewById(R.id.spinnercountry); List<ImageItem> imageItemList = new ArrayList<>(); // 使用自定义数据类的适配器 ArrayAdapter<ImageItem> adapter = new ArrayAdapter<>(getApplicationContext(), android.R.layout.simple_spinner_item, imageItemList); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(adapter); FirebaseFirestore db = FirebaseFirestore.getInstance(); CollectionReference imagesRef = db.collection("images"); imagesRef.get().addOnCompleteListener(task -> { if (task.isSuccessful()) { for (QueryDocumentSnapshot document : task.getResult()) { String name = document.getString("name"); String picLink = document.getString("pic"); imageItemList.add(new ImageItem(name, picLink)); } adapter.notifyDataSetChanged(); } }); Registerbtn.setOnClickListener(v -> { String league = League.getText().toString(); String team1 = Team1.getText().toString(); String team2 = Team2.getText().toString(); String tip = Tip.getText().toString(); // 获取选中项的链接 ImageItem selectedItem = (ImageItem) spinner.getSelectedItem(); String selectedPicLink = selectedItem.getPicLink(); Map<String, Object> tips = new HashMap<>(); tips.put("league", league); tips.put("team1", team1); tips.put("team2", team2); tips.put("tip", tip); tips.put("image", selectedPicLink); tips.put("Created at", new Timestamp(new Date())); db.collection("tips") .add(tips) .addOnSuccessListener(documentReference -> Toast.makeText(CreateData.this, "Successful", Toast.LENGTH_SHORT).show()) .addOnFailureListener(e -> Toast.makeText(CreateData.this, "Failed", Toast.LENGTH_SHORT).show()); }); } }
关键修改说明
- 新增
ImageItem类:绑定名称和链接,重写toString()确保Spinner显示名称 - 统一适配器逻辑:移除冗余的双List和双适配器,使用单个存储关联数据的List和适配器
- 提交时获取链接:直接从选中的
ImageItem对象中提取链接,避免字符串匹配的错误风险 - 简化代码结构:优化Firestore数据加载逻辑,减少冗余操作
内容的提问来源于stack exchange,提问作者Khalil Laouini
相关产品推荐
相关产品推荐

