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

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());
        });
    }
}

关键修改说明

  1. 新增ImageItem类:绑定名称和链接,重写toString()确保Spinner显示名称
  2. 统一适配器逻辑:移除冗余的双List和双适配器,使用单个存储关联数据的List和适配器
  3. 提交时获取链接:直接从选中的ImageItem对象中提取链接,避免字符串匹配的错误风险
  4. 简化代码结构:优化Firestore数据加载逻辑,减少冗余操作

内容的提问来源于stack exchange,提问作者Khalil Laouini

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 13:22:02