I am using firebase database to retrieve user data into my android studio application. I am looking to sum all of the numbers under the child ("BlueCount") together to get an all time total. I am having trouble retrieving all the "BlueCount" data from each different date.
I am trying to add all the underlined "BlueCount" values together.
I have tried this but i can only retrieve data from the current date...
private TextView blueValue;
private TextView redValue;
private TextView greenValue;
private TextView yellowValue;
private ArrayList<Integer> blist = new ArrayList<>();
private ArrayList<Integer> rlist = new ArrayList<>();
private ArrayList<Integer> glist = new ArrayList<>();
private ArrayList<Integer> ylist = new ArrayList<>();
private ArrayList<Integer> bblist = new ArrayList<>();
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dataview);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
blueValue = (TextView)findViewById(R.id.blueValue);
redValue = (TextView)findViewById(R.id.redValue);
greenValue = (TextView)findViewById(R.id.greenValue);
yellowValue = (TextView)findViewById(R.id.yellowValue);
final FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
if (user == null){
return;
}
final DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
final Date date = new Date();
String userID = user.getUid();
String strDate = dateFormat.format(date);
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference databaseReference = database.getReference();
databaseReference.child("users")
.child(userID)
.child(strDate)
.child("BlueCount").addChildEventListener(new ChildEventListener() {
#Override
public void onChildAdded(#NonNull DataSnapshot dataSnapshot, #Nullable String s) {
int num = 0;
String holder = String.valueOf(dataSnapshot.getValue());
num += Integer.parseInt(holder.trim());
blist.add(num);
int sum = 0;
for (int counter=0;counter<blist.size();counter++){
sum+= blist.get(counter);
}
blueValue.setText(" "+sum);
}
#Override
public void onChildChanged(#NonNull DataSnapshot dataSnapshot, #Nullable String s) {
}
#Override
public void onChildRemoved(#NonNull DataSnapshot dataSnapshot) {
}
#Override
public void onChildMoved(#NonNull DataSnapshot dataSnapshot, #Nullable String s) {
}
#Override
public void onCancelled(#NonNull DatabaseError databaseError) {
}
});
Firebase can only load complete nodes, or nodes that can be queries. So you'll have to load all data, and then loop over each level to determine the totals.
Something like this should do the trick:
DatabaseReference databaseReference = database.getReference();
DatabaseReference userReference = databaseReference.child("users").child(userID);
userReference.addListenerForSingleValueEvent(new ValueEventListener() {
#Override
public void onDataChange(DataSnapshot dataSnapshot) {
long totalBlueCount = 0;
for (DataSnapshot yearSnapshot: dataSnapshot.getChildren()) {
for (DataSnapshot monthSnapshot: yearSnapshot.getChildren()) {
for (DataSnapshot daySnapshot: monthSnapshot.getChildren()) {
DataSnapshot blueSnapshot = daySnapshot.child("BlueCount");
long dayBlueCount = 0;
for (DataSnapshot daySnapshot: monthSnapshot.getChildren()) {
long count = Long.parseLong(daySnapshot.getValue(String.class));
dayBlueCount += count;
}
System.out.println(yearSnapshot.getKey()+"-"+monthSnapshot.getKey()+"-"+daySnapshot.getKey()+": blue count = "+dayBlueCount);
totalBlueCount += dayBlueCount;
}
}
}
System.out.println("Total blue count = "+totalBlueCount);
}
#Override
public void onCancelled(DatabaseError databaseError) {
throw databaseError.toException();
}
}
I would consider if the hierarchy really helps you here, as the code would be a lot simpler if each day was just at the same level under a user "2019-07-16", "2019-07-17", etc.
Related
I am trying to store my firebase data in an arraylist and then use it, but when I try to read the arraylist it shows null or only 2 data. Using the Log, I realize that the childEventListener is storing the data one by one and when I read the arraylist it doesn't have all the data. So I need to store all the data first and when the childEventListener finishes read the arraylist.
I need help finding the most efficient way to do this.
This is the code I have: (I have this code snippet written in onCreate).
ArrayList<Data> listData = new ArrayList<>();
/**onCreate**/
childEventListener = new ChildEventListener() {
#Override
public void onChildAdded(#NonNull DataSnapshot dataSnapshot, #Nullable String s) {
if (dataSnapshot.getChildrenCount() > 0) {
Data data = dataSnapshot.getValue(Data.class);
listData.add(data);
buildRecycler();
} else {
Toast.makeText(getApplicationContext(), getString(R.string.AunNoHayDatos), Toast.LENGTH_LONG).show();
}
}
#Override
public void onChildChanged(#NonNull DataSnapshot dataSnapshot, #Nullable String s) {
}
#Override
public void onChildRemoved(#NonNull DataSnapshot dataSnapshot) {
}
#Override
public void onChildMoved(#NonNull DataSnapshot dataSnapshot, #Nullable String s) {
}
#Override
public void onCancelled(#NonNull DatabaseError databaseError) {
}
};
mDbRef.addChildEventListener(childEventListener);
/**onCreate**/
/*out of onCreate*/
public void buildRecycler(){
for(int i=0; i< listData.size(); i++){
SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy", Locale.getDefault());
Date date = null;
try {
date = df.parse(listData.get(i).getFecha());
} catch (ParseException e) {
e.printStackTrace();
}
Calendar cal = Calendar.getInstance();
if(date != null){
cal.setTime(date);
}
cal.setFirstDayOfWeek(Calendar.SUNDAY);
cal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
String[] days = new String[7];
for (int j = 0; j < 7; j++)
{
days[j] = df.format(cal.getTime());
cal.add(Calendar.DAY_OF_MONTH, 1);
}
listWeeks.add(days[0]);
}
}
It's easier in that case to use a ValueEventListener like this:
valueEventListener = new ValueEventListener() {
#Override
public void onDataChange(#NonNull DataSnapshot dataSnapshot) {
listData.clear();
for (DataSnapshot childSnapshot dataSnapshot.getChildren()) {
Data data = childSnapshot.getValue(Data.class);
listData.add(data);
}
buildRecycler();
}
#Override
public void onCancelled(#NonNull DatabaseError databaseError) {
throw databaseError.toException(); // never ignore errors
}
};
mDbRef.addValueEventListener(valueEventListener);
So now all data is passed in a single dataSnapshot, and we loop over its getChildren() to get the individual Data objects.
You'll note that I added a listData.clear(), since onDataChange gets called with a snapshot of all children each time, not just with the ones that were changed.
I trying to access UserInfo, I've stored in Firebase Realtime Database with Database Reference like this
Notification -> SenderUserId -> ReceiverUserId.
Please Check the image I want to access all children of ReceiverId Node
As I am new the picture won't appear there is a link only:
Link to screenshot so that you guys can understand clearly
I try some answer but it didn't work for me.
1) Link to the answer
2)Link to second answer
3)Link to 3rd answer
How I am storing this data:
private void AllNotificationInfo()
{
Calendar calForDate = Calendar.getInstance();
SimpleDateFormat currentDate = new SimpleDateFormat("dd-MMMM-yyyy");
saveCurrentDate = currentDate.format(calForDate.getTime());
Calendar calForTime = Calendar.getInstance();
SimpleDateFormat currentTime = new SimpleDateFormat("HH:mm");
saveCurrentTime = currentTime.format(calForTime.getTime());
UsersRef.child(SenderUserId).addValueEventListener(new ValueEventListener() {
#Override
public void onDataChange(#NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.exists())
{
String userprofileImage = dataSnapshot.child("profileimage").getValue().toString();
String fullname = dataSnapshot.child("Full_Name").getValue().toString();
HashMap postsMap = new HashMap( );
postsMap.put("time", saveCurrentTime);
postsMap.put("date", saveCurrentDate);
postsMap.put("profileimage", userprofileImage);
postsMap.put("fullname", fullname);
NotificationRef.child(SenderUserId).child(ReceiverUserId).updateChildren(postsMap)
.addOnCompleteListener(new OnCompleteListener() {
#Override
public void onComplete(#NonNull Task task) {
if (task.isSuccessful()){
Toast.makeText(PersonProfileActivity.this, "Friend Request Sent!", Toast.LENGTH_SHORT).show();
}
else
{
String message = task.getException().getMessage();
Toast.makeText(PersonProfileActivity.this, "Error! "+message, Toast.LENGTH_SHORT).show();
}
}
});
}
}
#Override
public void onCancelled(#NonNull DatabaseError databaseError) {
}
});
}
The data is stored properly. No issue but I can't retrieve my data
and I am storing data in one activity and retrieving in another activity.
This is how I tried to retrieve the Info:
public class NotificationsActivity extends AppCompatActivity {
private Toolbar NotificationToolbar;
private RecyclerView RnotificationList;
private DatabaseReference NotificationRef, UsersRef;
private FirebaseAuth mAuth;
private String notification_sender_id,CurrentUserId;
List<String> NKeyList;
List<NotificationModel> NotificationList;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_notifications);
mAuth = FirebaseAuth.getInstance();
CurrentUserId = mAuth.getCurrentUser().getUid();
NotificationToolbar = (Toolbar) findViewById(R.id.notification_toolbar_layout);
setSupportActionBar(NotificationToolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
getSupportActionBar().setTitle("Notifications");
RnotificationList = (RecyclerView) findViewById(R.id.notification_list);
RnotificationList.setHasFixedSize(true);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setReverseLayout(true);
linearLayoutManager.setStackFromEnd(true);
RnotificationList.setLayoutManager(linearLayoutManager);
NotificationRef = FirebaseDatabase.getInstance().getReference().child("Notifications");
NKeyList = new ArrayList<>();
NotificationList = new ArrayList<>();
NotificationRef.addValueEventListener(new ValueEventListener() {
#Override
public void onDataChange(#NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.exists())
{
for (DataSnapshot dataSnapshot1: dataSnapshot.getChildren())
{
NKeyList.add(dataSnapshot1.getKey());
// Here I am getting the senderKey and converting into a string, I tried one only at index 0 for testing.
//then I am passing the key to a method where I am using this key for DatabaseReference.
String key = NKeyList.get(0);
GettingRequestSenderInfo(key);
}
}
}
#Override
public void onCancelled(#NonNull DatabaseError databaseError) {
}
});
}
private void GettingRequestSenderInfo(final String key) {
DatabaseReference ReqSenderRef = FirebaseDatabase.getInstance().getReference().child("Notifications")
.child(key).child(CurrentUserId);
//Here above "key" is SenderUserId and CurrentuserId is ReceiverUserId
ReqSenderRef.addValueEventListener(new ValueEventListener() {
#Override
public void onDataChange(#NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.exists())
{
for (DataSnapshot dataSnapshot1: dataSnapshot.getChildren())
{
NotificationModel model = dataSnapshot1.getValue(NotificationModel.class);
NotificationList.add(model);
}
NotificationAdapter notificationAdapter1 = new NotificationAdapter(NotificationsActivity.this, NotificationList, NKeyList);
RnotificationList.setAdapter(notificationAdapter1);
}
}
#Override
public void onCancelled(#NonNull DatabaseError databaseError) {
}
});
}
}
But I am getting NotificationList empty. there is no value...
I am using RecyclerView, there is one Model Class and Adapter Class if necessary I'll include both classes.But I am getting Null NotificationList All I want to access the data showed in the image above please check.
I think the saved node must be like this Notfications/ReceiverID/SenderID:
NotificationRef.child(ReceiverUserId).child(SenderUserId).updateChildren(postsMap)
.addOnCompleteListener(new OnCompleteListener() {
..............
..............
Now in the NotificationsActivity:
make sure the ref is correctly read:
NotificationRef =FirebaseDatabase.getInstance().getReference().child("Notifications").child(CurrentUserId);
I am trying to populate a recycler view using nested queries. The first query goes to groups_list node and takes data in the node and the unique key. Then it goes to groups node with the key and gets data under that key. The result of both the queries needs to be updated in recycler view.
In short, the first query gets some data and a key, the key is used to make the second query. The result from both these queries need to be updated in the recycler view. I am using a model class and recycler view adapter for this.
But I am getting an error below.
My Fragment is as follows:
// Firebase
fbDatabaseRootNode = FirebaseDatabase.getInstance().getReference();
fbDatabaseRefGroupList = fbDatabaseRootNode.child("groups_list").child(current_user_id);
fbDatabaseRefGroups = fbDatabaseRootNode.child("groups");
fbDatabaseRefGroupList.addValueEventListener(new ValueEventListener() {
#Override
public void onDataChange(#NonNull DataSnapshot dataSnapshot) {
// Array to Get Group List
lGroupsList = new ArrayList<>();
if (dataSnapshot.exists()) {
// Clear Array to Get Group List
lGroupsList.clear();
for (DataSnapshot glSnapshot : dataSnapshot.getChildren()) {
// Use The Model To Format Array List and Pass It Into It
GroupsListModel g = glSnapshot.getValue(GroupsListModel.class);
// Array to Get Group List
lGroupsList.add(g);
String groupID = String.valueOf(glSnapshot.getKey());
fbDatabaseRefGroups.child(groupID).addValueEventListener(new ValueEventListener() {
#Override
public void onDataChange(#NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
for (DataSnapshot gSnapshot : dataSnapshot.getChildren()) {
// Use The Model To Format Array List and Pass It Into It
GroupsListModel g = gSnapshot.getValue(GroupsListModel.class);
// Array to Get Group List
lGroupsList.add(g);
}
}
}
#Override
public void onCancelled(#NonNull DatabaseError databaseError) {
}
});
}
aGroupList = new GroupsListAdapter(getContext(), lGroupsList);
rvGroupList.setAdapter(aGroupList);
}
}
#Override
public void onCancelled(#NonNull DatabaseError databaseError) {
System.out.println("The read failed: " + databaseError.getCode());
}
});
And My Firebase Database Structure Looks Like
"groups" : {
"-LaPfENd0G4pHlejrcd6" : {
"group_creation_date" : 1553078221782,
"group_logo" : "0",
"group_member_count" : "0",
"group_name" : "dog lovers",
"group_tagline" : "we love dogs..."
},
"-LaPhG0YHnF3FG0Czxom" : {
"group_creation_date" : 1553078751686,
"group_logo" : "0",
"group_member_count" : "0",
"group_name" : "hi",
"group_tagline" : "hello"
}
},
"groups_list" : {
"F81wvGx9a7fXRrfVPQMhQtkM0wv2" : {
"-LaPfENd0G4pHlejrcd6" : {
"block_status" : "0",
"hide_status" : "0",
"notification_status" : "0",
"pin_sequence" : "0",
"report_status" : "0"
},
"-LaPhG0YHnF3FG0Czxom" : {
"block_status" : "0",
"hide_status" : "0",
"notification_status" : "0",
"pin_sequence" : "0",
"report_status" : "0"
}
}
},
The Model Class Is
public class GroupsListModel {
private String block_status;
private String hide_status;
private String notification_status;
private String pin_sequence;
private String report_status;
private String group_name;
private Long group_creation_date;
private String group_logo;
private String group_member_count;
private String group_tagline;
public GroupsListModel() {
}
public GroupsListModel(String block_status, String hide_status, String notification_status, String pin_sequence, String report_status, String group_name, Long group_creation_date, String group_logo, String group_member_count, String group_tagline) {
this.block_status = block_status;
this.hide_status = hide_status;
this.notification_status = notification_status;
this.pin_sequence = pin_sequence;
this.report_status = report_status;
this.group_name = group_name;
this.group_creation_date = group_creation_date;
this.group_logo = group_logo;
this.group_member_count = group_member_count;
this.group_tagline = group_tagline;
}
public String getBlock_status() {
return block_status;
}
public void setBlock_status(String block_status) {
this.block_status = block_status;
}
public String getHide_status() {
return hide_status;
}
public void setHide_status(String hide_status) {
this.hide_status = hide_status;
}
public String getNotification_status() {
return notification_status;
}
public void setNotification_status(String notification_status) {
this.notification_status = notification_status;
}
public String getPin_sequence() {
return pin_sequence;
}
public void setPin_sequence(String pin_sequence) {
this.pin_sequence = pin_sequence;
}
public String getReport_status() {
return report_status;
}
public void setReport_status(String report_status) {
this.report_status = report_status;
}
public String getGroup_name() {
return group_name;
}
public void setGroup_name(String group_name) {
this.group_name = group_name;
}
public Long getGroup_creation_date() {
return group_creation_date;
}
public void setGroup_creation_date(Long group_creation_date) {
this.group_creation_date = group_creation_date;
}
public String getGroup_logo() {
return group_logo;
}
public void setGroup_logo(String group_logo) {
this.group_logo = group_logo;
}
public String getGroup_member_count() {
return group_member_count;
}
public void setGroup_member_count(String group_member_count) {
this.group_member_count = group_member_count;
}
public String getGroup_tagline() {
return group_tagline;
}
public void setGroup_tagline(String group_tagline) {
this.group_tagline = group_tagline;
}
}
And The Error is
Can't convert object of type java.lang.Long to type com.example.myproject
The logs from datasnapshots are coming as follows... first one...
The log from second one...
Possible Solution 1 (Passing To Recycler View An Issue Otherwise Working)
This seems to be getting the data in proper sequence now just have to pass it into the Model Array List and Set The Adapter
// Get The Data
fbDatabaseRefGroupList.addChildEventListener(new ChildEventListener() {
#Override
public void onChildAdded(#NonNull DataSnapshot dataSnapshot, #Nullable String s) {
if (dataSnapshot.exists()) {
final String groupID = dataSnapshot.getKey();
final String blockStatus = (String) dataSnapshot.child("block_status").getValue();
final String hideStatus = (String) dataSnapshot.child("hide_status").getValue();
final String notificationStatus = (String) dataSnapshot.child("notification_status").getValue();
final String pinSequence = (String) dataSnapshot.child("pin_sequence").getValue();
final String reportStatus = (String) dataSnapshot.child("report_status").getValue();
fbDatabaseRefGroups.child(groupID).addListenerForSingleValueEvent(new ValueEventListener() {
#Override
public void onDataChange(#NonNull DataSnapshot dataSnapshot) {
String groupName = (String) dataSnapshot.child("group_name").getValue();
String groupTagLine = (String) dataSnapshot.child("group_name").getValue();
String groupMemberCount = (String) dataSnapshot.child("group_name").getValue();
}
#Override
public void onCancelled(#NonNull DatabaseError databaseError) {
}
});
}
}
#Override
public void onChildChanged(#NonNull DataSnapshot dataSnapshot, #Nullable String s) {
}
#Override
public void onChildRemoved(#NonNull DataSnapshot dataSnapshot) {
}
#Override
public void onChildMoved(#NonNull DataSnapshot dataSnapshot, #Nullable String s) {
}
#Override
public void onCancelled(#NonNull DatabaseError databaseError) {
}
});
Possible Solution 2 (List Merging Is An Issue - Otherwise Working)
// Firebase
fbDatabaseRootNode = FirebaseDatabase.getInstance().getReference();
fbDatabaseRefGroupList = fbDatabaseRootNode.child("groups_list").child(current_user_id);
fbDatabaseRefGroups = fbDatabaseRootNode.child("groups");
// Array to Get Group List
lGroupsListList = new ArrayList<>();
lGroupsList = new ArrayList<>();
lCombinedList = new ArrayList<>();
// Clear Array to Get Group List
lGroupsList.clear();
// Clear Array to Get Group List
lGroupsListList.clear();
// Clear Array to Get Group List
lCombinedList.clear();
ValueEventListener valueEventListener = new ValueEventListener() {
#Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot ds : dataSnapshot.getChildren()) {
// Use The Model To Format Array List and Pass It Into It
GroupsListModel g = ds.getValue(GroupsListModel.class);
// Array to Get Group List
lGroupsListList.add(g);
final String key = ds.getKey();
final String blockStatus = (String) ds.child("block_status").getValue();
DatabaseReference keyRef = fbDatabaseRootNode.child("groups").child(key);
ValueEventListener eventListener = new ValueEventListener() {
#Override
public void onDataChange(DataSnapshot dataSnapshot) {
// Use The Model To Format Array List and Pass It Into It
GroupsListModel g = dataSnapshot.getValue(GroupsListModel.class);
// Array to Get Group List
lGroupsList.add(g);
String groupName = (String) dataSnapshot.child("group_name").getValue();
Log.d(TAG, "groupdetails: " + key + "--" + groupName + "--" + blockStatus);
}
#Override
public void onCancelled(#NonNull DatabaseError databaseError) {
Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
}
};
keyRef.addListenerForSingleValueEvent(eventListener);
}
}
#Override
public void onCancelled(#NonNull DatabaseError databaseError) {
Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
}
};
aGroupList = new GroupsListAdapter(getContext(), lGroupsList);
rvGroupList.setAdapter(aGroupList);
fbDatabaseRefGroupList.addListenerForSingleValueEvent(valueEventListener);
#Prateek Jain Your answer is giving error please see screenshot below:
Working Solution Based on Prateek Jains Inputs
public class GroupsListFragment extends Fragment {
private static final String TAG = "GroupsListFragment";
// Recycler View
private RecyclerView rvGroupList;
private GroupsListAdapter aGroupList;
private List<GroupsListModel> lGroupsListList;
private List<GroupsListModel> lGroupsList;
private List<GroupsListModel> lCombinedList;
// Firebase
private FirebaseAuth mAuth;
private DatabaseReference fbDatabaseRootNode;
private DatabaseReference fbDatabaseRefGroupList;
private DatabaseReference fbDatabaseRefGroups;
private String current_user_id;
private String groupID;
private List<String> lgroupIDs;
#Nullable
#Override
public View onCreateView(#NonNull LayoutInflater inflater, #Nullable ViewGroup container, #Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_groups_list, container, false);
mAuth = FirebaseAuth.getInstance();
current_user_id = mAuth.getCurrentUser().getUid();
// Init Recycler View
rvGroupList = view.findViewById(R.id.f_groups_list_groups_list);
rvGroupList.setHasFixedSize(true);
rvGroupList.setLayoutManager(new LinearLayoutManager(getActivity()));
// Firebase
fbDatabaseRootNode = FirebaseDatabase.getInstance().getReference();
fbDatabaseRefGroupList = fbDatabaseRootNode.child("groups_list").child(current_user_id);
fbDatabaseRefGroups = fbDatabaseRootNode.child("groups");
// Get The Data
fbDatabaseRefGroupList.addChildEventListener(new ChildEventListener() {
#Override
public void onChildAdded(#NonNull DataSnapshot dataSnapshot, #Nullable String s) {
// Array to Get Group List
lGroupsList = new ArrayList<>();
if (dataSnapshot.exists()) {
// Clear Array to Get Group List
lGroupsList.clear();
final String groupID = dataSnapshot.getKey();
final String blockStatus = (String) dataSnapshot.child("block_status").getValue();
final String hideStatus = (String) dataSnapshot.child("hide_status").getValue();
final String notificationStatus = (String) dataSnapshot.child("notification_status").getValue();
final String pinSequence = (String) dataSnapshot.child("pin_sequence").getValue();
final String reportStatus = (String) dataSnapshot.child("report_status").getValue();
fbDatabaseRefGroups.child(groupID).addListenerForSingleValueEvent(new ValueEventListener() {
#Override
public void onDataChange(#NonNull DataSnapshot dataSnapshot) {
Long groupCreationDate = (Long) dataSnapshot.child("group_creation_date").getValue();
String groupLogo = (String) dataSnapshot.child("group_logo").getValue();
String groupMemberCount = (String) dataSnapshot.child("group_member_count").getValue();
String groupName = (String) dataSnapshot.child("group_name").getValue();
String groupTagLine = (String) dataSnapshot.child("group_tagline").getValue();
lGroupsList.add(new GroupsListModel(blockStatus, hideStatus, notificationStatus, pinSequence,
reportStatus, groupName, groupCreationDate, groupLogo, groupMemberCount, groupTagLine));
aGroupList.notifyDataSetChanged();
}
#Override
public void onCancelled(#NonNull DatabaseError databaseError) {
}
});
aGroupList = new GroupsListAdapter(getContext(), lGroupsList);
rvGroupList.setAdapter(aGroupList);
}
}
#Override
public void onChildChanged(#NonNull DataSnapshot dataSnapshot, #Nullable String s) {
}
#Override
public void onChildRemoved(#NonNull DataSnapshot dataSnapshot) {
}
#Override
public void onChildMoved(#NonNull DataSnapshot dataSnapshot, #Nullable String s) {
}
#Override
public void onCancelled(#NonNull DatabaseError databaseError) {
}
});
return view;
}
}
You have to add the required data to the list which is being used by your adapter to render the views. Once that is done you must call notifyDataSetChanged, so that adapter can reload its data from the updated list.
fbDatabaseRefGroups.child(groupID).addListenerForSingleValueEvent(new ValueEventListener() {
#Override
public void onDataChange(#NonNull DataSnapshot dataSnapshot) {
String groupName = (String) dataSnapshot.child("group_name").getValue();
String groupTagLine = (String) dataSnapshot.child("group_name").getValue();
String groupMemberCount = (String) dataSnapshot.child("group_name").getValue();
lGroupsList.add(new GroupsListModel(groupName, groupMemberCount, groupTagLine));
aGroupList.notifyDataSetChanged();
}
#Override
public void onCancelled(#NonNull DatabaseError databaseError) {
}
});
Data stored in firebase:
29-06-2018(date)
-AAAA
-25142(jobno)
-Park station(address)
-BMW(model)
-BBBB
-85142(jobno)
-Base station(address)
-Ford(model)
Here I want all the children under -BBBB. Don't want to loop through AAAA. How to get directly the child of BBBB. I'm having data (date, BBBB). Just want to get jobno, address, model of BBBB. Please suggest me a solution.
My code is here
DatabaseReference database = FirebaseDatabase.getInstance().getReference();
DatabaseReference pwd = database.child("29-06-2018").child("BBBB");
pwd.addValueEventListener(new ValueEventListener() {
#Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot ds : dataSnapshot.getChildren()) {
String a = ds.child("jobno").getValue(String.class);
String b = ds.child("address").getValue(String.class);
String c = ds.child("model").getValue(String.class);
}
}
#Override
public void onCancelled(DatabaseError error) {
}
});
You're listening to a single child /29-06-2018/BBBB. By looping over dataSnapshot.getChildren() you're looping over each property, and then try to reach a child property for each. That won't work, so you should get rid of the loop in onDataChange:
pwd.addValueEventListener(new ValueEventListener() {
#Override
public void onDataChange(DataSnapshot ds) {
String a = ds.child("jobno").getValue(String.class);
String b = ds.child("address").getValue(String.class);
String c = ds.child("model").getValue(String.class);
}
DatabaseReference database = FirebaseDatabase.getInstance().getReference();
DatabaseReference pwd = database.child("29-06-2018").child("BBBB");
pwd.addValueEventListener(new ValueEventListener() {
#Override
public void onDataChange(DataSnapshot dataSnapshot) {
String a = dataSnapshot.child("jobno").getValue(String.class);
String b = dataSnapshot.child("address").getValue(String.class);
String c = dataSnapshot.child("model").getValue(String.class);
}
#Override
public void onCancelled(DatabaseError error) {
}
});
I am using GraphView to plot a data from firebase database.
What i want to achieve is display tmpHr as y value, with Timestamp as the label in x axis. I have retrieved the data from firebase, and I have successfully plotted the tmpHr in y axis. I have tried the method below, but it doesn't work. How can I get this the right way?
Any help would be appreciated. Thank you very much.
public class RetrieveApp extends AppCompatActivity {
FirebaseAuth auth;
FirebaseUser user;
int hrValue;
String hrValueTimestamp;
ArrayList<Integer> array2; //array for tmpHr value
ArrayList<String> array7; //array for hrValueTimestamp
LineGraphSeries<DataPoint> series ;
int x=0;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_retrieve_app);
DatabaseReference userdatabase = FirebaseDatabase.getInstance().getReference().child("Users");
auth = FirebaseAuth.getInstance();
user = auth.getCurrentUser();
final GraphView graph = (GraphView)findViewById(R.id.graph);
series = new LineGraphSeries<>();
graph.addSeries(series);
DatabaseReference ref = userdatabase.child(user.getUid());
array2 = new ArrayList<>(); //array for tmpHR
array7 = new ArrayList<>(); //array for hrValueTimestamp
ref.child("hrvalue").child("nilaihr").addChildEventListener(new ChildEventListener() {
#Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
hrValue = dataSnapshot.child("tmpHR").getValue(Integer.class);
hrValueTimestamp = dataSnapshot.child("Timestamp").getValue(String.class);
Log.i("timestamp value", "timestamp value " + hrValueTimestamp);
Log.i("hr value", "hr value " + hrValue);
array2.add(hrValue);
array7.add(hrValueTimestamp);
x = x+1;
DataPoint point = new DataPoint(x, hrValue);
series.appendData(point, false, 1000);
graph.setCustomLabelFormatter(new CustomLabelFormatter() {
#Override
public String formatLabel(double value, boolean isValueX) {
if (isValueX) {
return (hrValueTimestamp);
}
return null;
}
});
}
#Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
#Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
#Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
#Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
You can do it using static labels formatter:
StaticLabelsFormatter staticLabelsFormatter = new StaticLabelsFormatter(graph);
staticLabelsFormatter.setHorizontalLabels(array7); // <- array with you labels
graph.getGridLabelRenderer().setLabelFormatter(staticLabelsFormatter);
Since the labels are very long, maybe you'll want to set an angle for them so that they do not overlap:
graph.getGridLabelRenderer().setHorizontalLabelsAngle(135);