如何在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
相关产品推荐
相关产品推荐

