Почему ArrayList не вставляет некоторые значения?

#java #android #firebase #firebase-storage

#java #Android #firebase #firebase-хранилище

Вопрос:

         items = new ArrayList<String>();
        itemsAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, items);
        listView.setAdapter(itemsAdapter);
        registerForContextMenu(listView);
        fstore.child(/*MyFolder1*/).child(/*MyFolder2*/).listAll().addOnSuccessListener(new OnSuccessListener<ListResult>() {
            @Override
            public void onSuccess(ListResult listResult) {
                for(StorageReference sref : listResult.getItems())
                {
                    items.add(sref.getName());  //<- NOT working
                    System.out.println("IIIIII: " sref.getName());  //sref.getName() returns proper value here
                }
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Toast.makeText(tabtwoactivity.this, "Fetching failed", Toast.LENGTH_LONG).show();
            }
        });
       itemsAdapter.notifyDataSetChanged();
  

Почему не sref.getName() добавляется в список?Все items.add() инструкции до и после работают правильно.

Игнорируйте эту часть — мне нужно добавить еще немного информации, чтобы иметь возможность опубликовать вопрос. Я надеюсь, что этого достаточно.

Ответ №1:

API хранилища Firebase listAll() является асинхронным и возвращается непосредственно перед получением результатов. Ваш обратный вызов вызывается некоторое время спустя, после получения результатов. Во время выполнения listAll() ваш код выполняет немедленную визуализацию пустого списка и notifyDataSetChanged в конечном итоге ничего не делает. Ваш код должен дождаться завершения результатов, прежде чем пытаться отобразить какие-либо представления.

Попробуйте вместо этого вызвать itemsAdapter.notifyDataSetChanged() onSuccess обратный вызов, чтобы заставить адаптер отображать новые результаты.

 fstore.child(/*MyFolder1*/).child(/*MyFolder2*/).listAll().addOnSuccessListener(new OnSuccessListener<ListResult>() {

            @Override
            public void onSuccess(ListResult listResult) {
                for(StorageReference sref : listResult.getItems())
                {
                    items.add(sref.getName());  //<- NOT working
                    System.out.println("IIIIII: " sref.getName());  //sref.getName() returns proper value here
                }
                itemsAdapter.notifyDataSetChanged();
            }
  

Вероятно, вы также захотите решить, что вы хотите отобразить до listAll() завершения, поскольку это может быть не так быстро, как вы хотите.