Reputation: 333
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
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
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
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