#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()
завершения, поскольку это может быть не так быстро, как вы хотите.