Array List Becomes Empty After Addlistenerforsinglevalueevent Listener Method
I am fetching data from firebase database to a recyclerview. I can't get the data to the RecyclerViewAdapter since the Array list becomes empty after the addListenerForSingleValueE
Solution 1:
onDataChange()
is asynchronous therefore since you are calling the arraylist after addListenerForSingleValueEvent
, it will return an empty list because the data is not yet retrieved.
To solve your problem, you need to add the arrayList inside onDatachange()
:
reference.addListenerForSingleValueEvent(newValueEventListener() {
@OverridepublicvoidonDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot singleSnapshot : dataSnapshot.getChildren()) {
String text1 = (String) singleSnapshot.child("Text1").getValue();
String text2 = (String) singleSnapshot.child("Text2").getValue();
ArrayList<Item> arr = newArrayList<Item>();
arr.add(newItem(text1, text2));
RecyclerViewAdapter adapter = newRecyclerViewAdapter(getContext(), arr);
RecyclerView recyclerView = view.findViewById(R.id.dashboardRecyclerView);
recyclerView.setLayoutManager(newLinearLayoutManager(getActivity()));
recyclerView.setAdapter(adapter);
}
}
@OverridepublicvoidonCancelled(@NonNull DatabaseError databaseError) {
}
});
Solution 2:
Firebase database calls are not asynchronous means the lines below query will be executed before you are getting response from firebase.
So update your code as below to work as expected.
RecyclerViewAdapter adapter;
@OverridepublicViewonCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
final View view = inflater.inflate(R.layout.fragment_dashboard, container, false);
database = FirebaseDatabase.getInstance();
ArrayList<Item> arr = newArrayList<Item>();
adapter = newRecyclerViewAdapter(getContext(), arr);// Here the ArrayList arr is emptyRecyclerView recyclerView = view.findViewById(R.id.dashboardRecyclerView);
recyclerView.setLayoutManager(newLinearLayoutManager(getActivity()));
recyclerView.setAdapter(adapter);
DatabaseReference reference = database.getReference("NoticeBoard");
reference.addListenerForSingleValueEvent(newValueEventListener() {
@OverridepublicvoidonDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot singleSnapshot : dataSnapshot.getChildren()) {
String text1 = (String) singleSnapshot.child("Text1").getValue();
String text2 = (String) singleSnapshot.child("Text2").getValue();
arr.add(newItem(text1, text2));
}
if(adapter != null){
adapter.notifyDataSetChanged();
}
}
@OverridepublicvoidonCancelled(@NonNull DatabaseError databaseError) {
}
});
return view;
}
Notes:It is good practice to set data after view has been created in fragments. You can use onViewCreated()
method of fragment for that.
Post a Comment for "Array List Becomes Empty After Addlistenerforsinglevalueevent Listener Method"