Basically after deleting Object from Firebase, notifyDataSetChanged() does not update it in realtime. I tried to remove object from adapter itself but it also fails.
Coming back to this fragment shows updated list but i think it's because of child added. Here's my code.
public class ArchiveFragment extends Fragment {
public static ArchiveFragment newInstance(Beer beer) {
ArchiveFragment archiveFragment = new ArchiveFragment();
if (beer != null) {
Bundle args = new Bundle();
args.putSerializable("beer", beer);
archiveFragment.setArguments(args);
}
return archiveFragment;
}
public ArchiveFragment(){}
private ArrayList<Beer> beerDB = new ArrayList<>();
private ListView beerList;
private RecyclerView beerRec;
private DatabaseReference mDatabase;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final View view = inflater.inflate(R.layout.archive_fragment, container, false);
final Activity activity = getActivity();
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
beerList = (ListView)view.findViewById(R.id.beerList);
final ArrayAdapter<Beer> arrayAdapter = new ArrayAdapter<Beer>(getActivity(), android.R.layout.simple_list_item_1,beerDB);
mDatabase = FirebaseDatabase.getInstance().getReference().child("Users").child(user.getUid()).child("BeerList");
beerList.setAdapter(arrayAdapter);
beerList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Object deletedBeer = beerList.getItemAtPosition(i);
Beer delBeer = (Beer) deletedBeer;
deleteBeer(delBeer.getKey());
}
});
mDatabase.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Beer value = dataSnapshot.getValue(Beer.class);
value.setKey(dataSnapshot.getKey());
beerDB.add(value);
arrayAdapter.notifyDataSetChanged();
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
String key = dataSnapshot.getKey();
beerDB.remove(key);
arrayAdapter.notifyDataSetChanged();
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {}
@Override
public void onCancelled(DatabaseError databaseError) {}
});
return view;
}
public void deleteBeer(String key){
mDatabase.child(key).removeValue();
}
}
You're removing the item from your ArrayList using the remove function which is incorrect. The remove function takes the index of the item in your ArrayList which needs to be removed. But here, when you get the key from the dataSnapshot it doesn't match any index of your ArrayList and hence the item is not actually removed from your ArrayList. So you need to change your onChildRemoved function like this.
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
String key = dataSnapshot.getKey();
for (int i = 0; i < beerDB.size(); i++) {
// Find the item to remove and then remove it by index
if (beerDB.get(i).key.equals(key)) {
beerDB.remove(i);
break;
}
}
arrayAdapter.notifyDataSetChanged();
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With