Since the ValueEventListener gets triggered every time the data in the Firebase Database updates, it is also called when a new upload is done while the RecyclerView is showing. The way I have it now causes duplicate entries when this happens, because the Upload objects are already in the mUploads List. And when an upload is done, the whole database gets queried again and all items added to the already existing ArrayList I don't know how to solve this. Should I create a new Arraylist every time the ValueEventListener is triggered or do I need a completely different callback?
Also the ValueEventListener interfers with my mAdapter.notifyItemRemoved call because the ValueEventListener gets triggered as soon as I delete something.
public class ImagesActivity extends AppCompatActivity implements ImageAdapter.OnItemClickListener {
private RecyclerView mRecyclerView;
private ImageAdapter mAdapter;
private ProgressBar mProgressCircle;
private DatabaseReference mDatabaseRef;
private FirebaseStorage mStorage;
private List<Upload> mUploads;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_show_images);
mUploads = new ArrayList<>();
mRecyclerView = findViewById(R.id.recycler_view);
mRecyclerView.setHasFixedSize(true);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mProgressCircle = findViewById(R.id.progress_circle);
mDatabaseRef = FirebaseDatabase.getInstance().getReference("uploads");
mStorage = FirebaseStorage.getInstance();
mDatabaseRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
Upload upload = postSnapshot.getValue(Upload.class);
upload.setKey(postSnapshot.getKey());
mUploads.add(upload);
}
mAdapter = new ImageAdapter(ImagesActivity.this, mUploads);
mRecyclerView.setAdapter(mAdapter);
mAdapter.setOnItemClickListener(ImagesActivity.this);
mProgressCircle.setVisibility(View.INVISIBLE);
}
@Override
public void onCancelled(DatabaseError databaseError) {
Toast.makeText(ImagesActivity.this, databaseError.getMessage(), Toast.LENGTH_LONG).show();
mProgressCircle.setVisibility(View.INVISIBLE);
}
});
}
@Override
public void onDeleteClick(final int position) {
Upload selectedItem = mUploads.get(position);
final String selectedKey = selectedItem.getKey();
StorageReference imageRef = mStorage.getReferenceFromUrl(selectedItem.getImageUrl());
imageRef.delete().addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
mDatabaseRef.child(selectedKey).removeValue();
mUploads.remove(position);
mAdapter.notifyItemRemoved(position);
}
});
}
}