0

I am unable to add any listener after the end of the onCanelled Listener Actually, I want to do some task after getting data from the snapshot for which I need onSuccessListener and I am unable to add that

public UserFragment() {
    // Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view =  inflater.inflate(R.layout.fragment_user, container, false);


    myUserDataList = new ArrayList<>();

    userId = FirebaseAuth.getInstance().getCurrentUser().getUid();
    databaseReference = FirebaseDatabase.getInstance().getReference("/Users/");


    databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren())
            {
                if (Objects.equals(dataSnapshot1.getKey(), userId))
                {
                    MyUserData myUserData = dataSnapshot1.getValue(MyUserData.class);
                    myUserDataList.add(myUserData);
                }
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    }); // Problem over here
Frank van Puffelen
  • 565,676
  • 79
  • 828
  • 807
Akshay Bengani
  • 37
  • 2
  • 10

1 Answers1

1

The addListenerForSingleValueEvent method doesn't return a Task, so you can't attach a success listener to it.

If you need to run some code after the data has been loaded, put that code into the onDataChange method. If the code must also run if the listener gets rejected by the server-side security rules, also add/call the same code from onCancelled.

So something like:

databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren())
        {
            if (Objects.equals(dataSnapshot1.getKey(), userId))
            {
                MyUserData myUserData = dataSnapshot1.getValue(MyUserData.class);
                myUserDataList.add(myUserData);
            }
        }
        onResponseReceived();
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.w(TAG, "Error listening for data: "+databaseError.toString());
        onResponseReceived();
    }

    private void onResponseReceived() {
      ... do what you need to do here ...
    }
});
Frank van Puffelen
  • 565,676
  • 79
  • 828
  • 807
  • Thanks a lot I really needed this fix I have one more question Actually I need data from firebase where I need objects containing objects therefore I need Arraylist of Arraylist to store such data. Example Link to code and JSON snapshot https://stackoverflow.com/questions/53466045/array-of-array-list-in-android-to-get-the-firebase-object-of-object – Akshay Bengani Nov 25 '18 at 09:27