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

如何在Spinner选中项时显示Firestore文档中对应书籍的价格?

问题:Spinner选中书籍后无法显示对应价格

我的Firestore数据库结构如下:

Books (collection)
|
|--- book1 (document)
|    |--- Price : "100"
|    |--- Title : "Book-1"
|
|--- book2
|    |--- Price : "200"
|    |--- Title : "Book-2"

尝试以下代码后,无法正确显示选中书籍的价格,请问需要添加什么代码来实现该功能?

public class MainActivity extends AppCompatActivity {
    FirebaseFirestore db;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView priceView = findViewById(R.id.price);

        db =  FirebaseFirestore.getInstance();

        CollectionReference booksRef = db.collection("Books");
        Spinner spinner = (Spinner) findViewById(R.id.spinner);
        List<String> booksList = new ArrayList<>();
        ArrayAdapter<String> adapter = new ArrayAdapter<>(getApplicationContext(), android.R.layout.simple_spinner_item, booksList);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(adapter);
        booksRef.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>(){
            @Override
            public void onComplete(@NonNull Task<QuerySnapshot> task) {
                if (task.isSuccessful()) {
                    for (QueryDocumentSnapshot document : task.getResult()) {
                        String bt = document.getString("Title");
                        booksList.add(bt);
                    }
                    adapter.notifyDataSetChanged();
                }
            }
        });
        spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int position, long l) {
                priceView.setText("Price:  " + adapterView.getItemIdAtPosition(position).);
            }
            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {

            }
                                          }
        );

    }

解决方案

问题核心是你只存储了书籍标题,没有关联对应的价格信息,同时原代码存在语法错误。可以通过以下步骤修复:

1. 创建Book实体类

用来封装每本书的标题和价格,方便Firestore解析和数据关联:

public class Book {
    private String Title;
    private String Price;

    // Firestore需要空构造函数
    public Book() {}

    public Book(String title, String price) {
        Title = title;
        Price = price;
    }

    public String getTitle() {
        return Title;
    }

    public String getPrice() {
        return Price;
    }
}

注意字段名要和Firestore中的键完全一致(大小写敏感)

2. 修改MainActivity代码

改用存储Book对象的列表,自定义适配器显示标题,并在选中时直接获取价格:

public class MainActivity extends AppCompatActivity {
    FirebaseFirestore db;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView priceView = findViewById(R.id.price);

        db = FirebaseFirestore.getInstance();

        CollectionReference booksRef = db.collection("Books");
        Spinner spinner = findViewById(R.id.spinner);
        
        // 存储Book对象的列表
        List<Book> booksList = new ArrayList<>();
        
        // 自定义适配器,显示书籍标题
        ArrayAdapter<Book> adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, booksList) {
            @NonNull
            @Override
            public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
                TextView view = (TextView) super.getView(position, convertView, parent);
                view.setText(booksList.get(position).getTitle());
                return view;
            }

            @Override
            public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
                TextView view = (TextView) super.getDropDownView(position, convertView, parent);
                view.setText(booksList.get(position).getTitle());
                return view;
            }
        };
        
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(adapter);

        booksRef.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
            @Override
            public void onComplete(@NonNull Task<QuerySnapshot> task) {
                if (task.isSuccessful()) {
                    for (QueryDocumentSnapshot document : task.getResult()) {
                        // 直接将文档转为Book对象
                        Book book = document.toObject(Book.class);
                        booksList.add(book);
                    }
                    adapter.notifyDataSetChanged();
                } else {
                    // 可选:添加错误提示
                    Toast.makeText(MainActivity.this, "加载书籍失败", Toast.LENGTH_SHORT).show();
                }
            }
        });

        spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int position, long l) {
                // 获取选中的Book对象,取出价格
                Book selectedBook = booksList.get(position);
                priceView.setText("Price:  " + selectedBook.getPrice());
            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {
                priceView.setText("Price:  ");
            }
        });
    }
}

关键修改说明

  • 用List<Book>替代List<String>,同时存储标题和价格,解决数据关联问题
  • 自定义ArrayAdapter的getView和getDropDownView方法,确保Spinner显示书籍标题
  • 修复原代码中adapterView.getItemIdAtPosition(position).的语法错误
  • 通过document.toObject(Book.class)简化Firestore文档到对象的解析

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 19:41:05