Como preencher o Android ListView com informações da consulta Firebase
Este é o meu primeiro post, por isso, se eu não seguisse algum protocolo que deveria, peço desculpas.
Estou tentando preencher um ListView com algumas informações do meu banco de dados Firebase. Acho que o problema que estou tendo é que a consulta ao banco de dados é muito lenta (o encadeamento provavelmente está baixando imagens) e minha atividade carrega seu layout de atividade sem aguardar a conclusão da execução do encadeamento. (Se eu percorrer o depurador e esperar um pouco, acabarei vendo as informações que estou analisando: nomes de usuários, números de usuários e fotos de usuários) Tudo o que consultamos sugere que eu deveria usar o AsyncTask para fazer isso. Ao contrário do uso de bloqueio de thread ou de um semáforo, o AsyncTask é seguro para threads.
Para meu entendimento, as consultas do Firebase já estão sendo executadas de forma assíncrona; portanto, o método doInBackground para AsyncTask que "tentei" implementar parece redundante. Além disso, estou um pouco confuso com a assinatura sobrecarregada do AsyncTask e a chamada para: new someTask.execute ("algumas coisas em uma string").
Alguma sugestão de como posso fazer isso? Qualquer feedback é muito apreciado!
// Por favor, ignore o recuo menor de colar meu código em
protected void onCreate(Bundle savedInstanceState) {
...
new getFirebaseInfoTask();
}
private class getFirebaseInfoTask extends AsyncTask {
@Override
protected Object doInBackground(Object... args) {
// Do stuff
userInfoList = GetUserInfoFromFirebase.getUserInfo();
// Unsure if I need to return here.
return userInfoList;
}
@Override
protected void onProgressUpdate(Object... args) {
// Update your UI here
populateUserInfoList();
}
}
private void populateUserInfoList() {
// Create list of items
Collections.addAll(userInfoList);
populateFriendsListView();
}
private void populateFriendsListView() {
// Build the adapter
ArrayAdapter<UserInfo> adapter = new MyListAdapter();
// Configure the list view
ListView listView = (ListView) findViewById(R.id.friends_listview);
listView.setAdapter(adapter);
registerClickCallBack();
}
... // More code
public class GetUserInfoFromFirebase {
public static ArrayList getUserInfo() {
final ArrayList<UserInfo> list = new ArrayList<UserInfo>();
Firebase firebase = new Firebase("https:......firebaseio.com");
firebase.child("users").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
HashMap<String, Object> users = (HashMap<String, Object>) snapshot.getValue();
for(Object user : users.values()) {
HashMap<String, Object> userMap = (HashMap<String, Object>) user;
String userNumber = (String) userMap.remove("number");
if(!list.contains(userNumber)) {
String name = (String) userMap.remove("username");
String pic = (String) userMap.remove("profile_picture");
UserInfo info = new UserInfo(userNumber, name, pic);
list.add(info);
}
}
}
@Override
public void onCancelled(FirebaseError firebaseError) {}
});
return list;
}