Instead of a list I suggest you to use a RecyclerView, Android created RecyclerView as a ListView improvement, so yes, you can create an attached list with ListView control, but using RecyclerView is easier and better. You can read more in this post: RecyclerView vs ListView
Also, you can just recover the adapter for your list using a FirebaseRecyclerAdapter
which will do all the work for you populating the list and retrieving you all the data that you want(I usually user custom objects in my code which equal the values of my firebase database, in this way, you can use them in your FirebaseRecyclerAdapter to improve the data retrieve)
For example, here i populate a listview of users with a profile image using a FirebaseRecyclerAdapter:
private void initializeRecyclerAdapter() {
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setReverseLayout(true);
linearLayoutManager.setStackFromEnd(true);
mRecyclerUsersView.setLayoutManager(linearLayoutManager);
Query allPostsQuery = FirebaseUtil.getUsersRef();
mAdapter = getFirebaseRecyclerAdapter(allPostsQuery);
mAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
@Override
public void onItemRangeInserted(int positionStart, int itemCount) {
super.onItemRangeInserted(positionStart, itemCount);
// TODO: Refresh feed view.
}
});
mRecyclerUsersView.setAdapter(mAdapter);
}
private FirebaseRecyclerAdapter<User, UserListViewHolder> getFirebaseRecyclerAdapter(Query query) {
return new FirebaseRecyclerAdapter<User, UserListViewHolder>(
User.class, R.layout.user_row_item, UserListViewHolder.class, query) {
@Override
protected void populateViewHolder(UserListViewHolder viewHolder, User user, int position) {
setupUser(viewHolder, user, position, null);
}
};
}
private void setupUser(final UserListViewHolder UserViewHolder, final User user, final int position, final String inPostKey) {
//Set the items for every new view
UserViewHolder.setIcon(user.getPhoto_url());
UserViewHolder.setText(user.getEmail());
final String postKey;
if (mAdapter instanceof FirebaseRecyclerAdapter) {
postKey = ((FirebaseRecyclerAdapter) mAdapter).getRef(position).getKey();
} else {
postKey = inPostKey;
}
FirebaseUtil.getUsersRef().child(postKey).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(final DataSnapshot dataSnapshot) {
//Add users to the newGroup item
UserViewHolder.setPostClickListener(new UserListViewHolder.UserClickListener() {
@Override
public void onUserClick() {
// mNewGroup.addUserToGroup(dataSnapshot.getKey());
mNewGroupUsers.addUserToGroup(dataSnapshot.getKey());
}
});
}
@Override
public void onCancelled(DatabaseError databaseError) {
//TODO ControlOnCancelled
}
});
}
And, as you can see, my User object is so simple(the names of the object variables must equal your firebase items, for sublevels you can use Hashmaps inside your object):
public class User {
private String display_name;
private String email;
private String photo_url;
//[...] get/set methods and constructors
Finally, here is my viewHolder user class:
public class UserListViewHolder extends RecyclerView.ViewHolder {
private final View mView;
private static final int POST_TEXT_MAX_LINES = 6;
private ImageView mIconView;
private TextView mAuthorView;
private UserClickListener mListener;
public UserListViewHolder(View itemView) {
super(itemView);
mView = itemView;
mIconView = (ImageView) mView.findViewById(R.id.user_image_profile);
mAuthorView = (TextView) mView.findViewById(R.id.user_text_profile);
mView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mListener.onUserClick();
}
});
}
public void setIcon(String url) {
GlideUtil.loadProfileIcon(url, mIconView);
}
public void setPostClickListener(UserClickListener listener) {
mListener = listener;
}
public void setText(final String text) {
if (text == null || text.isEmpty()) {
mAuthorView.setVisibility(View.GONE);
return;
} else {
mAuthorView.setVisibility(View.VISIBLE);
mAuthorView.setText(text);
mAuthorView.setMaxLines(POST_TEXT_MAX_LINES);
}
}
public interface UserClickListener {
void onUserClick();
}
}
Feel free to ask any doubt! hope that it will help you!