【发布时间】:2020-03-12 00:17:13
【问题描述】:
所以当我在数据库查询期间记录 array.size 的结果时,它显示了正确的大小(此时它应该是 size = 2)。调用方法后,以下行 Throws an index out of bounds 异常,无效索引 0,大小为 0:
currentVehicle = dataVehicles.get(vehicleSelectorAdapter.getVehicleCurrentPos());
我是否遗漏了正在清除 ArrayList 的内容?
关于创建方法
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_virtual_garage);
mAuth = FirebaseAuth.getInstance();
db = FirebaseFirestore.getInstance();
vehicleInformation = new ArrayList<String>();
dataVehicles = new ArrayList<Vehicle>();
getVehicles();
vehicleSelectorView = (RecyclerView) findViewById(R.id.virtualGarageSelector);
vehicleSelectorLayout = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
vehicleSelectorView.setLayoutManager(vehicleSelectorLayout);
vehicleSelectorAdapter = new VehicleAdapter(dataVehicles);
vehicleSelectorView.setAdapter(vehicleSelectorAdapter);
currentVehicle = dataVehicles.get(vehicleSelectorAdapter.getVehicleCurrentPos());
Log.d("d", "VIN: "+currentVehicle.getVin());
查询 Firestore 数据库
public void getVehicles()
{
CollectionReference vehicleRef = db.collection("Vehicles");
Query query = null;
if(lastQueriedDocument != null)
{
query = vehicleRef.whereEqualTo("userID", FirebaseAuth.getInstance().getCurrentUser().getUid()).startAfter(lastQueriedDocument);
} else {
query = vehicleRef.whereEqualTo("userID", FirebaseAuth.getInstance().getCurrentUser().getUid());
}
query.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if(task.isSuccessful())
{
for(QueryDocumentSnapshot document: task.getResult())
{
Vehicle vehicle = document.toObject(Vehicle.class);
dataVehicles.add(vehicle);
Log.d("d", "Vehicle Added, Array size = "+dataVehicles.size());
}
if(task.getResult().size() != 0)
{
lastQueriedDocument = task.getResult().getDocuments().get(task.getResult().size()-1);
}
vehicleSelectorAdapter.notifyDataSetChanged();
Log.d("d", "Vehicle Added, Array size = "+dataVehicles.size());
}
}
});
}
编辑:以下文章解决了我的问题:
Wait until Firestore data is retrieved to launch an activity
感谢大家的帮助和指导!
【问题讨论】:
-
getVehicles();是异步的dataVehicles在调用addOnCompleteListener之前不会被填充 -
它在哪里,可能没问题,但可能将
currentVehicle = dataVehicles.get(vehicleSelectorAdapter.getVehicleCurrentPos());移到addOnCompleteListener内 -
我已经完成了这两项工作,但我仍然遇到相同的错误
-
在做可怕的袋熊说你需要在 addOnComleteListener 中将适配器设置为 recyclerview 之后,其他的将为空
-
请检查重复项以了解您为什么会出现这种行为以及如何使用自定义回调解决此问题。
标签: java android-studio google-cloud-firestore