diff --git a/database/src/main/java/com/firebase/ui/database/FirebaseIndexArray.java b/database/src/main/java/com/firebase/ui/database/FirebaseIndexArray.java index e7b700cf2..cc5fcdfac 100644 --- a/database/src/main/java/com/firebase/ui/database/FirebaseIndexArray.java +++ b/database/src/main/java/com/firebase/ui/database/FirebaseIndexArray.java @@ -33,7 +33,7 @@ public class FirebaseIndexArray extends CachingObservableSnapshotArray imp private static final String TAG = "FirebaseIndexArray"; private DatabaseReference mDataRef; - private Map mRefs = new HashMap<>(); + private Map mRefs = new HashMap<>(); private FirebaseArray mKeySnapshots; private List mDataSnapshots = new ArrayList<>(); @@ -109,8 +109,8 @@ public void onCancelled(DatabaseError error) { public void removeChangeEventListener(@NonNull ChangeEventListener listener) { super.removeChangeEventListener(listener); if (!isListening()) { - for (Query query : mRefs.keySet()) { - query.removeEventListener(mRefs.get(query)); + for (DatabaseReference ref : mRefs.keySet()) { + ref.removeEventListener(mRefs.get(ref)); } clearData(); @@ -150,7 +150,7 @@ private boolean isKeyAtIndex(String key, int index) { } protected void onKeyAdded(DataSnapshot data) { - Query ref = mDataRef.child(data.getKey()); + DatabaseReference ref = mDataRef.child(data.getKey()); // Start listening mRefs.put(ref, ref.addValueEventListener(new DataRefListener())); @@ -162,20 +162,18 @@ protected void onKeyMoved(DataSnapshot data, int index, int oldIndex) { if (isKeyAtIndex(key, oldIndex)) { DataSnapshot snapshot = removeData(oldIndex); mDataSnapshots.add(index, snapshot); - notifyChangeEventListeners(ChangeEventListener.EventType.MOVED, - snapshot, - index, - oldIndex); + notifyChangeEventListeners(EventType.MOVED, snapshot, index, oldIndex); } } protected void onKeyRemoved(DataSnapshot data, int index) { String key = data.getKey(); - mDataRef.child(key).removeEventListener(mRefs.remove(mDataRef.getRef().child(key))); + ValueEventListener listener = mRefs.remove(mDataRef.getRef().child(key)); + if (listener != null) mDataRef.child(key).removeEventListener(listener); if (isKeyAtIndex(key, index)) { DataSnapshot snapshot = removeData(index); - notifyChangeEventListeners(ChangeEventListener.EventType.REMOVED, snapshot, index); + notifyChangeEventListeners(EventType.REMOVED, snapshot, index); } } @@ -217,20 +215,20 @@ public void onDataChange(DataSnapshot snapshot) { int index = getIndexForKey(key); if (snapshot.getValue() != null) { - if (!isKeyAtIndex(key, index)) { - // We don't already know about this data, add it - mDataSnapshots.add(index, snapshot); - notifyChangeEventListeners(ChangeEventListener.EventType.ADDED, snapshot, index); - } else { + if (isKeyAtIndex(key, index)) { // We already know about this data, just update it updateData(index, snapshot); - notifyChangeEventListeners(ChangeEventListener.EventType.CHANGED, snapshot, index); + notifyChangeEventListeners(EventType.CHANGED, snapshot, index); + } else { + // We don't already know about this data, add it + mDataSnapshots.add(index, snapshot); + notifyChangeEventListeners(EventType.ADDED, snapshot, index); } } else { if (isKeyAtIndex(key, index)) { // This data has disappeared, remove it removeData(index); - notifyChangeEventListeners(ChangeEventListener.EventType.REMOVED, snapshot, index); + notifyChangeEventListeners(EventType.REMOVED, snapshot, index); } else { // Data does not exist Log.w(TAG, "Key not found at ref: " + snapshot.getRef());