【问题标题】:Array List automatically clearing after storing information from Firestore [duplicate]从 Firestore 存储信息后,阵列列表自动清除 [重复]
【发布时间】: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


【解决方案1】:

我认为这与变量范围有关:

onCreate 方法内声明的dataVehicles 在方法外不可用。也许删除这个声明就足够了......

由于您在 getVehicles() 方法中没有错误,因此您可能也有全局变量 dataVehicles,并且您在 onCreate 中隐藏了它。

我找到了关于它的好文章here point 6.

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 2016-05-06
    • 2019-05-12
    • 1970-01-01
    • 2018-08-04
    • 1970-01-01
    • 2011-03-17
    • 2020-12-12
    • 1970-01-01
    相关资源
    最近更新 更多