Come popolare Android ListView con informazioni provenienti da query Firebase

Questo è il mio primo post quindi se non ho seguito un protocollo che dovrei fare, scusa.

Sto cercando di popolare un ListView con alcune informazioni del mio database Firebase. Penso che il problema che sto avendo è che la query al database sia troppo lenta (il thread probabilmente sta scaricando le immagini) e la mia attività carica il suo layout di attività senza aspettare che il thread finisca di eseguire. (Se passi attraverso il debugger e aspetto un po ', vedo finalmente le informazioni che sto analizzando: nomi utente, numbers utente e immagini utente) Tutto ciò che ho domandato suggerisce che dovrei utilizzare AsyncTask per farlo. Contrariamente all'uso del block dei thread o di un semaforo b / c AsyncTask è filo sicuro.

  • Riferimento di una string in una risorsa di string arrays con xml
  • Errore di Android Studio Errore: Errore CreateProcess = 216, Questa versione di% 1 non è compatibile con la versione di Windows in esecuzione
  • Come allineare il text in cima a TextView?
  • Quali funzionalità le applicazioni Web Progressive hanno vs applicazioni native e viceversa, su Android
  • Come get il mio context di attività?
  • Non è in grado di accedere ai dati gerarchici in Firebase
  • A mio avviso, le query Firebase stanno già eseguendo in modo asincrono; quindi il metodo doInBackground per AsyncTask che ho "provato" a implementare sembra ridondante. Inoltre, sono un po 'confuso della firma sovraccarica di AsyncTask e la chiamata a: new someTask.execute ("qualche roba in una string").

    Quali suggerimenti su come posso realizzare questo? Ogni feedback è molto apprezzato!

    // Si prega di ignorare l'indentazione minore da incollare il codice in

    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; } 

  • È necessario utilizzare un tema Theme.AppCompat (o discendente) con questa attività. La modifica a Theme.AppCompat provoca altri errori
  • Android | Ottieni tutti gli elementi di un gruppo di ViewGroup
  • Come faccio a passare variables extra durante una ricerca invocata da un SearchView / Widget?
  • Hai bisogno solo di tastiera soft key?
  • Sostituire il frammento con un altro frammento all'interno di ViewPager
  • Diff tra getExternalFilesDir e getExternalStorageDirectory ()
  • 3 Solutions collect form web for “Come popolare Android ListView con informazioni provenienti da query Firebase”

    Così ho capito. Ho liberato l'AsyncTask e ho spostato la chiamata di metodo che ho voluto eseguire in onProgressUpdate al di fuori del for loop del mio onDataChange in modo che il thread che effettivamente ottiene l'accesso al metodo onDataChange chiama il mio metodo populateFriendsView.

     private void populateUserInfoList() { userInfoList = new ArrayList<UserInfo>(); 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 (!userInfoList.contains(userNumber)) { String name = (String) userMap.remove("username"); String pic = (String) userMap.remove("profile_picture"); UserInfo info = new UserInfo(userNumber, name, pic); userInfoList.add(info); } } // thread executing here can get info from database and make subsequent call Collections.addAll(userInfoList); populateFriendsListView(); } @Override public void onCancelled(FirebaseError firebaseError) { String message = "Server error. Refresh page"; Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); } }); } 

    La stessa Firebase fornisce methods asincroni per la query dei dati. Essi hanno creato un'applicazione di esempio per mostrare come eseguire il backup del Listview con informazioni Firebase tramite Android Chat

    controllare questo

    In questo esempio, la funzionalità di base viene inserita in una generica base di adattatore denominata FirebaseListAdapter …

    Snippet dalla mia base di codice di lavoro

      Firebase firebase = new Firebase(Constants.FREEBASE_DB_URL); Firebase childRef = firebase.child("sessions"); childRef.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot snapshot) { System.out.println(snapshot.getValue()); Map<String, Session> td = (HashMap<String, Session>) snapshot.getValue(); List<Session> valuesToMatch = new ArrayList<Session>(td.values()); apiClientCallback.onSuccess(valuesToMatch); } @Override public void onCancelled(FirebaseError error) { Toast.makeText(context, "onCancelled" + error.getMessage(), Toast.LENGTH_SHORT).show(); } }); 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.