How to populate Android ListView with information from Firebase request

This is my first post, so if I did not follow some protocol, I had to apologize.

I am trying to populate a ListView with some information from my Firebase database. I think the problem that I encountered is that the database query is too slow (the thread is probably loading images), and my activity is loading its activity layout, without waiting for the stream to complete. (If I go through the debugger and wait a bit, I will eventually see the information that I will parse: usernames, user numbers and user images). Everything I requested suggests that I should use AsyncTask for this. Unlike using thread lock or b / c semaphore, AsyncTask is thread safe.

As I understand it, Firebase requests are already running asynchronously; therefore, the doInBackground method for AsyncTask, which I "tried" to implement, seems redundant. Also, I'm a little confused by the overloaded AsyncTask signature and the call: new someTask.execute ("some things on the line").

Any suggestions on how I can do this? Any feedback is greatly appreciated!

// Please ignore the minor indent from pasting my code 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;
}
+4
source share
3 answers

, . AsyncTask , onProgressUpdate, for onDataChange, , onDataChange, 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();
        }
    });
}
+2

Firebase . , , Listview firebase Android Chat

FirebaseListAdapter...

+1

A snippet from my working code base

  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();
                }
            });
0
source

All Articles