Jack Resone
Jack Resone

Reputation: 333

How to get Array List Object From Firebase

I added an ArrayList to the Firebase but I don't know how to get it back.

mDatabase.child("list").child("person").setValue(myValues);
//This is how I added it to my firebase

What I have tried is this. This is my error message

com.google.firebase.database.DatabaseException: Can't convert object of type java.util.ArrayList to type Item

ValueEventListener postListener = new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot snapshot) {
                for (DataSnapshot data : snapshot.getChildren()) {
                    GenericTypeIndicator<HashMap<String, Item>> t = new GenericTypeIndicator<HashMap<String, Item>>() {};

                    HashMap<String, Item> beans = data.getValue(t);

                    Set set = beans.entrySet();
                    Iterator i = set.iterator();

                    // Display elements
                    while (i.hasNext()) {
                        Map.Entry me = (Map.Entry) i.next();
                        Toast.makeText(getContext(), me.getKey() + ": ", Toast.LENGTH_LONG).show();
                        Toast.makeText(getContext(), me.getValue().toString(), Toast.LENGTH_LONG).show();
                        System.out.println(me.getValue());
                    }
                }

            }
            @Override
            public void onCancelled(DatabaseError firebaseError) {
                Log.e("The read failed: " ,firebaseError.getMessage());
            }
        };
        mDatabase.addValueEventListener(postListener);

Upvotes: 6

Views: 13826

Answers (3)

Martin Zeitler
Martin Zeitler

Reputation: 76679

When a list is being returned, this usually would be HashMap<String, ?> to ArrayList<?> ...

ArrayList<SomeClass> toArrayList(@NonNull DataSnapshot snapshot) {
    GenericTypeIndicator<HashMap<String, SomeClass>> t = new GenericTypeIndicator<HashMap<String, SomeClass>>() {};
    HashMap<String, SomeClass> map = snapshot.getValue(t);
    ArrayList<SomeClass> items = new ArrayList<>();
    if(map != null) {
        for (Map.Entry<String, SomeClass> pair : map.entrySet()) {
            items.add(pair.getValue());
        }
    }
    return items;
}

I'd rather wonder how to pass a generic Class<?>.

Upvotes: 0

Sachin Suthar
Sachin Suthar

Reputation: 692

Using this i got list of message which i store in this object.

    private void lerMessagensFirebase() {
    mFirebaseDatabaseReference = FirebaseDatabase.getInstance().getReference();
    final ChatFirebaseAdapter firebaseAdapter = new ChatFirebaseAdapter(mFirebaseDatabaseReference.child("chatmodel"), userModel.getName(), this);
    firebaseAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
        @Override
        public void onItemRangeInserted(int positionStart, int itemCount) {
            super.onItemRangeInserted(positionStart, itemCount);
            int friendlyMessageCount = firebaseAdapter.getItemCount();
            int lastVisiblePosition = mLinearLayoutManager.findLastCompletelyVisibleItemPosition();
            if (lastVisiblePosition == -1 ||
                    (positionStart >= (friendlyMessageCount - 1) &&
                            lastVisiblePosition == (positionStart - 1))) {
                rvListMessage.scrollToPosition(positionStart);
            }
        }
    });
    rvListMessage.setLayoutManager(mLinearLayoutManager);
    rvListMessage.setAdapter(firebaseAdapter);
}

Upvotes: 0

Jack Resone
Jack Resone

Reputation: 333

Sorry if you were working on this all I needed to do was change the directory.

ValueEventListener postListener = new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot snapshot) {
                GenericTypeIndicator<ArrayList<Item>> t = new GenericTypeIndicator<ArrayList<Item>>() {};
                ArrayList<Item> yourStringArray = snapshot.getValue(t);
                Toast.makeText(getContext(),yourStringArray.get(0).getName(),Toast.LENGTH_LONG).show();
            }
            @Override
            public void onCancelled(DatabaseError firebaseError) {
                Log.e("The read failed: " ,firebaseError.getMessage());
            }
        };
        mDatabase.child("list/user1").addValueEventListener(postListener);

Upvotes: 17

Related Questions