Hidayah Adlin
Hidayah Adlin

Reputation: 51

How to read data from RecyclerView and make comparison?

Hi I want to read the display data from RecyclerView and make comparison.

This my layout for the activity:

A B

What I want to do is to read all data from RecyclerView and compare with Daily Calorie Suggestion.

After reading all data, I need to make comparisons on how many times the user have taken above, less or sufficient total calories as shown in the "Analysis of Total Calories Consumed of Last 7 Days"

The code:

@Override
    protected void onStart() {
        Query query = ref.orderByChild("timeStamp").limitToLast(7).endAt(Date);
        super.onStart();
        if (query != null) {
            query .addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                    if (dataSnapshot.exists()) {
                        userHighlights = new ArrayList<>();
                        for (DataSnapshot ds : dataSnapshot.getChildren()) {
                            userHighlights.add(ds.getValue(HighightsModel.class));
                            requiredCalorieRef = FirebaseDatabase.getInstance().getReference("Users").child(FirebaseAuth.getInstance().getCurrentUser().getUid());
                            requiredCalorieRef.addListenerForSingleValueEvent(new ValueEventListener() {
                                @Override
                                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                                    String userCalorieSuggestion = String.valueOf((dataSnapshot.child("daily calorie").getValue()));
                                    int daily_calorie = Integer.parseInt(userCalorieSuggestion);
                                }
                                @Override
                                public void onCancelled(@NonNull DatabaseError databaseError) {
                                }
                            });
                        }
                        HighlightsAdapter highlightsAdapter = new HighlightsAdapter(userHighlights);
                        highlightsRV.setAdapter(highlightsAdapter);
                    }
                }
                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {
                    Toast.makeText(UserNewHighlights.this, databaseError.getMessage(),
                            Toast.LENGTH_SHORT).show();
                }
            });
        }
    }

This is my firebase: enter image description here

Do I have to write a new code to solve this problem or else? Any help will be much appreciated. Thanks

Upvotes: 0

Views: 80

Answers (3)

Hidayah Adlin
Hidayah Adlin

Reputation: 51

I have solved my problem by adding another child at History node. Whereby, previously I have only these for History :

previous children- Firebase

but I add new child which is called STATUS, the status is updated from previous activity as seen the pic below:

current children- Firebase

so what I did for the code is :

    private void upDateAnalysisAbove() {
        DatabaseReference ref = FirebaseDatabase.getInstance().getReference("History");
        DatabaseReference mRef = ref.child(FirebaseAuth.getInstance().getCurrentUser().getUid());
        Query mQuery = mRef.orderByChild("status").equalTo("ABOVE").limitToLast(7);
        mQuery.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                String value = String.valueOf(dataSnapshot.getChildrenCount());
                int values = Integer.parseInt(value);
                txt_above_output.setText(values + "   times(s)");

                upDateAnalysisLess(values);


            }
            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }

    //LESS
    private void upDateAnalysisLess(int values) {
        DatabaseReference ref = FirebaseDatabase.getInstance().getReference("History");
        DatabaseReference mRef = ref.child(FirebaseAuth.getInstance().getCurrentUser().getUid());
        Query mQuery = mRef.orderByChild("status").equalTo("LESS").limitToFirst(7);

        mQuery.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                String valueLess = String.valueOf(dataSnapshot.getChildrenCount());
                int values_Less = Integer.parseInt(valueLess);

                if (values_Less == 0){
                    txt_less_output.setText(values_Less + "   times(s)");
                }

                if (values > values_Less){
                    int finalCount = values - values_Less ;
                    txt_less_output.setText(finalCount + "   times(s)");
                }

                if (values <values_Less){
                    int finalCount = values_Less - values ;
                    txt_less_output.setText(finalCount + "   times(s)");
                }

               updateSuff();
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }

    //SUFFICIENT
    private void updateSuff() {

        DatabaseReference ref = FirebaseDatabase.getInstance().getReference("History");
        DatabaseReference mRef = ref.child(FirebaseAuth.getInstance().getCurrentUser().getUid());
        Query mQuery = mRef.orderByChild("status").equalTo("SUFFICIENT").limitToFirst(7);

        mQuery.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                String value = String.valueOf(dataSnapshot.getChildrenCount());
                int suffValue = Integer.parseInt(value);

                if (suffValue == 0) {
                    txt_sufficient_output.setText(suffValue + "   times(s)");
                }
                if (suffValue != 0){
                    txt_sufficient_output.setText(suffValue + "   times(s)");
                }
            }
            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

    }

Here is the output:

output

credit to this post that helped me a lot, and thanks for those who tried to help me.

Upvotes: 0

Masoud Darzi
Masoud Darzi

Reputation: 650

so The brute force solution is to have a for in your data after getting the 7 days average.

for (your 7 days data){
 // check if your data is lower or higher than the average
// and store number of higher or lower
}

looking for a better solution?

Upvotes: 0

Yang Liu
Yang Liu

Reputation: 1380

As @MasoudDarzi mentioned, it's not related to the RecyclerView.

You can try something like this:

@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

    if (dataSnapshot.exists()) {
        userHighlights = new ArrayList<>();
        for (DataSnapshot ds : dataSnapshot.getChildren()) {
            userHighlights.add(ds.getValue(HighightsModel.class));
            requiredCalorieRef = FirebaseDatabase.getInstance().getReference("Users").child(FirebaseAuth.getInstance().getCurrentUser().getUid());
            requiredCalorieRef.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    String userCalorieSuggestion = String.valueOf((dataSnapshot.child("daily calorie").getValue()));
                    int daily_calorie = Integer.parseInt(userCalorieSuggestion);
                }
                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {
                }
            });
        }
        HighlightsAdapter highlightsAdapter = new HighlightsAdapter(userHighlights);
        highlightsRV.setAdapter(highlightsAdapter);

        // do calculation here with userHighlights
        int countExceeded = 0, countBelow = 0, countSufficient = 0;
        for (HighightsModel h : userHighlights) {
            if (h.totalCalorie > daily_calorie) {
                countExceeded++;
            } else if (h.totalCalorie < daily_calorie) {
                countBelow++;
            } else {
                countSufficient++;
            }
        }
        // update your TextView with the count numbers
        // todo
    }
}

Upvotes: 1

Related Questions