Android中Firestore数据读取至Trade类后无法显示问题求助
问题分析与解决方案
核心问题:异步操作时序错误
Firestore的db.collection("Posts").get()是异步执行的,你调用getData()后立刻跳转MainActivity,此时Firestore还没完成数据读取和列表填充,MainActivity的onCreate方法中ListHandler.ListTrades仍是空集合,导致内容无法显示。
修复步骤
1. 调整数据加载完成后的跳转逻辑
修改onClick方法,等待Firestore数据加载完成后再启动MainActivity:
public void onClick(View v) { getData(); } void getData(){ db.collection("Posts").get().addOnCompleteListener( new OnCompleteListener<QuerySnapshot>() { @Override public void onComplete(@NonNull Task<QuerySnapshot> task) { if(task.isSuccessful()){ // 每次加载前清空列表,避免重复数据 ListHandler.ListTrades.clear(); for(QueryDocumentSnapshot document : task.getResult() ){ Log.d(TAG, document.getId() + "=>" + document.getData()); Map<String, Object> data = document.getData(); String Name = (String) data.get("Name"); String Surname = (String) data.get("Surname"); String Phone = (String) data.get("Phone"); String Description = (String) data.get("Description"); if(Name != null ){ Trade Service = new Trade(Name,Surname,Phone,Description); ListHandler.ListTrades.add(Service); }else{ Log.d(TAG, "Got Bad Data for " + document.getId() + " => " + document.getId()); } } // 数据加载完成后再跳转 Intent Job = new Intent(Post.this,MainActivity.class); startActivity(Job); }else{ Log.d(TAG, "Error getting document: ", task.getException()); Toast.makeText(Post.this, "数据加载失败", Toast.LENGTH_SHORT).show(); Intent Job = new Intent(Post.this,MainActivity.class); startActivity(Job); } } }); }
2. 优化MainActivity的展示逻辑
使用Trade类的getter方法访问属性(符合封装规范),并改用StringBuilder提升拼接性能:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); txtDisplay = findViewById(R.id.txtDisplay); btnPost1 = findViewById(R.id.btnPost); btnPost1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent Job = new Intent(MainActivity.this,Post.class); startActivity(Job); } }); if (!ListHandler.ListTrades.isEmpty()) { StringBuilder textBuilder = new StringBuilder(); for (Trade output: ListHandler.ListTrades) { textBuilder.append(output.getName()) .append("\n") .append(output.getSurname()) .append("\n") .append(output.getPhone()) .append("\n") .append(output.getDescription()) .append("\n\n"); } txtDisplay.setText(textBuilder.toString()); } }
3. 额外检查点
- 确认Firestore中
Posts集合的字段名和代码中"Name"、"Surname"等完全一致(大小写敏感),字段不匹配会导致属性值为null,无法添加到列表。 - 避免静态列表的长期持有问题,后续可考虑用LiveData或ViewModel替代静态集合,更符合Android架构规范。
内容的提问来源于stack exchange,提问作者user19417023
相关产品推荐
相关产品推荐

