Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Deleting from Firebase, notifyDataSetChanged(); doesn't refresh ListView

Tags:

android

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();
    }
}
like image 673
Piotr Sołtys Avatar asked Mar 01 '26 19:03

Piotr Sołtys


1 Answers

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();
}
like image 54
Reaz Murshed Avatar answered Mar 05 '26 07:03

Reaz Murshed