通过查询填充微调器

Populating a spinner via a query

我在通过从 Firestore 查询必要的字符串元素来填充微调器下拉元素时遇到了一个 strange/annoying 问题。查询部分不是问题。它是填充部分。微调器(实际上是 MaterialBetterSpinner)在片段中。而且我必须等待一两秒钟才能打开微调器。如果我不这样做,那么微调器将无法工作。我尝试将查询移动到 onCreate,然后移动到片段的 onStart 覆盖,但无济于事。在不破坏用户体验的情况下,我有什么选择可以使用处理程序禁用微调器几秒钟?

方法如下:

@Override
    public void onStart() {
        super.onStart();
        FirebaseFirestore firebaseFirestore = FirebaseFirestore.getInstance();
        Query myRestaurants = firebaseFirestore.collection("Restaurant_Data").whereArrayContains("users", getUser());
        myRestaurants.get().addOnSuccessListener(queryDocumentSnapshots -> {
            for (QueryDocumentSnapshot documentSnapshot : queryDocumentSnapshots) {
                Restaurant restaurant = documentSnapshot.toObject(Restaurant.class);
                spinnerList.add(restaurant.getRestaurantAddress());
                restaurantArrayList.add(restaurant);
            }
        }).addOnFailureListener(e -> {
            Log.d(TAG, "Exception for spinner: " + e.getMessage());
        });
    }

并且此方法是从片段中的 onCreateView 调用的:

private void getRestaurants() {
        ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(restaurantContext, android.R.layout.simple_dropdown_item_1line, spinnerList);
        materialDesignSpinner = restaurantView.findViewById(R.id.restaurant_spinner);
        materialDesignSpinner.setAdapter(arrayAdapter);
    }

您正在进行异步调用以获取 "Restaurant_Data"。因此,只有在获取数据后才会填充微调器。

您可以尝试通过禁用微调器来解决这个问题(如您所建议的),直到成功检索数据。另一种解决方法是预取数据(如果您确定此 activity 将被打开)。例如,您可以预取前面activity中的数据并将其存储在静态变量中。