如何从RecyclerView读取数据并进行比较?

时间:2019-11-24 06:03:51

标签: android firebase firebase-realtime-database android-recyclerview

嗨,我想从RecyclerView中读取显示数据并进行比较。

这是我的活动布局:

A B

我要做的是从RecyclerView中读取所有数据,并与“每日热量建议”进行比较。

读取所有数据后,我需要对用户摄入的总卡路里的数量进行比较,如“最近7天消耗的总卡路里分析”所示

代码:

@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();
                }
            });
        }
    }

这是我的火力基地: enter image description here

我是否必须编写新代码来解决此问题?任何帮助都感激不尽。谢谢

3 个答案:

答案 0 :(得分:1)

正如@MasoudDarzi所述,它与RecyclerView无关。

您可以尝试以下操作:

@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
    }
}

答案 1 :(得分:0)

因此,蛮力解决方案是在平均7天后获得一个for数据。

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

寻找更好的解决方案?

答案 2 :(得分:0)

我通过在“历史记录”节点上添加另一个孩子解决了我的问题。因此,以前我只有这些用于历史记录:

previous children- Firebase

但是我添加了一个名为STATUS的新孩子,状态从上一个活动中更新,如下图所示:

current children- Firebase

所以我对代码所做的是:

    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) {

            }
        });

    }

以下是输出:

output

post的信用对我有很大帮助,感谢那些试图帮助我的人。