首页 > 解决方案 > 根据存储在 Firebase-Android 中的值计算总计

问题描述

我正在尝试根据用户存储在云 Firestore 数据库中的数字创建总数。值的数量会有所不同,具体取决于用户添加到子集合中的项目数量。

我似乎无法弄清楚的是如何“获取值(itemCost在数据库上)并将它们加在一起然后显示为总成本。有人能指出我正确的方向吗?

我已经包含了活动的代码(我目前正在编写我的数据库查询)、服务于这个活动的列表适配器、生成视图的模型类,最后是 firebase 路径的屏幕截图。希望有帮助:

在此处输入图像描述

这是活动:

public class UsersMenuActivity extends AppCompatActivity {

private static final String TAG = "UserMenuActivity";
public static String finalId;
public static int totalCalsToPass;
public Context umContext;
public String venueId;
public Button myButton;
public int totalCalsData;
public int totalCals = 0;
Toolbar menuToolbar;
private FirebaseFirestore umFirestore;
private FirebaseAuth umFirebaseAuth;
private FirebaseAuth mAuth;
private RecyclerView umRecyclerView;
private List<UserMenu> userMenu;
private View.OnClickListener umClickListener;
private UserMenuListAdapter userMenuListAdapter;
private String getUserId;
private TextView passedCalContent;
//FOR THE CAL COUNT
private List<UserMenu> calsList;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate( savedInstanceState );
    setContentView( R.layout.activity_users_menu );

    menuToolbar = findViewById( R.id.menu_toolbar );
    setSupportActionBar( menuToolbar );

    if (getSupportActionBar() != null) {
        getSupportActionBar().setDisplayHomeAsUpEnabled( false );
        getSupportActionBar().setDisplayShowHomeEnabled( false );
    }

    myButton = findViewById( R.id.remove_button );

    userMenu = new ArrayList<>();
    userMenuListAdapter = new UserMenuListAdapter( getApplicationContext(), userMenu, umClickListener );

    umRecyclerView = (RecyclerView) findViewById( R.id.user_menu_recycler_view );
    umRecyclerView.setHasFixedSize( true );
    umRecyclerView.setLayoutManager( new LinearLayoutManager( this ) );
    umRecyclerView.setAdapter( userMenuListAdapter );

    passedCalContent = findViewById( R.id.users_menu_calories_set );
    passedCalContent.setText( valFromAct1 );

    umFirestore = FirebaseFirestore.getInstance();
    umFirebaseAuth = FirebaseAuth.getInstance();

    getUserId = Objects.requireNonNull( umFirebaseAuth.getCurrentUser() ).getUid();


    CollectionReference userMenuRef = umFirestore.collection( "AppUsers" )
            .document( getUserId )
            .collection( "UserMenu" );


    userMenuRef.limit( 100 ).addSnapshotListener( (documentSnapshots, e) -> {

        if (e != null) {
            Log.d( TAG, "Error: " + e.getMessage() );

        }
        assert documentSnapshots != null;
        for (DocumentChange doc : Objects.requireNonNull( documentSnapshots ).getDocumentChanges()) {
            UserMenu menu = doc.getDocument().toObject( UserMenu.class ).withId( doc.getDocument().getId() );

            Log.d( TAG, doc.getDocument().getId() + " => " + doc.getDocument() );

            finalId = doc.getDocument().getId();
            userMenu.add( menu );
            userMenuListAdapter.notifyDataSetChanged();
        }
    } );

//Method here to calculate the total cals value to show in header???
    calsList = new ArrayList<>();
    totalCalsData = calsList.size();
    totalCals = 0;


    Query calorieRef = umFirestore.collection( "AppUsers" )
            .document( getUserId )
            .collection( "UserMenu" ).whereEqualTo( "itemCals", true );

    calorieRef.limit( 15 ).addSnapshotListener( (QuerySnapshot documentSnapshots, FirebaseFirestoreException e) -> {

        if (e != null) {
            Log.d( TAG, "Error: " + e.getMessage() );
        }
        if (e == null) {
            Log.d( TAG, "Success: " + getUserId);
        }

        assert documentSnapshots != null;
        for (DocumentChange calDoc : Objects.requireNonNull( documentSnapshots ).getDocumentChanges()) {
            UserMenu mMenu = calDoc.getDocument().toObject( UserMenu.class ).withId( calDoc.getDocument().getId() );

            calsList.add( mMenu );

            for (int i = 0; i < calsList.size(); i++) {
                totalCals = totalCals + Integer.parseInt( String.valueOf( calsList.get( i ) ) );
            }
            totalCalsToPass = Integer.parseInt( String.valueOf( totalCals ) );

        }

    } );
}

这是适配器

import static com.melcolton.bite.UsersMenuActivity.finalId;

公共类 UserMenuListAdapter 扩展 RecyclerView.Adapter 实现 View.OnClickListener {

private static final String TAG = "Adapter Log";
private View.OnClickListener myClickListener;
private FirebaseFirestore fbFirestore;
private FirebaseAuth fbAuth;

public String fbUserId;
public List<UserMenu> userMenu;
public Context context;

public UserMenuListAdapter(Context context, List<UserMenu> userMenu, View.OnClickListener myClickListener) {
    this.myClickListener = myClickListener;
    this.userMenu =  userMenu ;
    this.context = context;
}

@NonNull
@Override
public UserMenuListAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

    Context context = parent.getContext();
    View menuView = LayoutInflater.from( context ).inflate( R.layout.item_confirm_list_element, parent, false );
    return new ViewHolder( menuView, myClickListener );
}

@Override
public void onBindViewHolder(@NonNull UserMenuListAdapter.ViewHolder holder, int position) {

    fbAuth = FirebaseAuth.getInstance();
    fbFirestore = FirebaseFirestore.getInstance();
    fbUserId = fbAuth.getCurrentUser().getUid();

    if (holder instanceof ViewHolder) {

        ViewHolder viewHolder = holder;

        holder.userMenuName.setText( userMenu.get( position ).getItemName() );
        holder.userMenuDesc.setText( userMenu.get( position ).getItemDesc() );
        holder.userMenuCals.setText( userMenu.get( position ).getItemCals().toString() );
        holder.userMenuCost.setText( userMenu.get( position ).getItemCost().toString() );

        holder.deleteButton.setOnClickListener( new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText( context, "Removed", Toast.LENGTH_SHORT ).show();


                fbFirestore.collection( "AppUsers" ).document(fbUserId).collection( "UserMenu" ).document(finalId)
                        .delete().addOnSuccessListener( new OnSuccessListener<Void>() {
                    @Override
                    public void onSuccess(Void aVoid) {

                        userMenu.remove( position );
                        notifyItemRemoved( position );
                        notifyItemRangeChanged( position, userMenu.size() );
                        notifyDataSetChanged();
                        holder.menuView.setVisibility( View.GONE );

                    }
                } );

            }

        });
    }
}

@Override
public int getItemCount() {

    return userMenu.size();
}

public void onEvent (QuerySnapshot queryDocumentSnapshots, FirebaseFirestoreException e) {
    if (e !=null) {
        Log.w( TAG, "onEvent error: ",e );
        onError (e);
    }
}

private void onError(FirebaseFirestoreException e) {
    Log.w( TAG, "onEvent error: ",e );
}

@Override
public void onClick(View v) {

}

public class ViewHolder extends RecyclerView.ViewHolder {

    public CardView userMenuCardView;
    public TextView userMenuName;
    public TextView userMenuDesc;
    public TextView userMenuCals;
    public TextView userMenuCost;
    public Button deleteButton;
    View menuView;


    public ViewHolder(View itemView, View.OnClickListener myClickListener) {
        super( itemView );
        itemView.setOnClickListener( myClickListener );
        menuView = itemView;

        userMenuCardView = menuView.findViewById( R.id.user_menu_cardview );
        userMenuName = menuView.findViewById( R.id.txt_cart_item_name );
        userMenuDesc = menuView.findViewById( R.id.txt_cart_item_desc );
        userMenuCals = menuView.findViewById( R.id.txt_cart_item_cals );
        userMenuCost = menuView.findViewById( R.id.txt_cart_item_cost );
        deleteButton = menuView.findViewById( R.id.remove_button );
    }
}

}

最后是模型类

import com.google.firebase.firestore.IgnoreExtraProperties;

@IgnoreExtraProperties 公共类 UserMenu 扩展 UserId {

private String ItemName;
private String ItemDesc;
private Long ItemCals;
private Double ItemCost;
private String itemId;

public UserMenu() {

}

public UserMenu(String itemName, String itemDesc, Long itemCals, Double itemCost) {
    ItemName = itemName;
    ItemDesc = itemDesc;
    ItemCals = itemCals;
    ItemCost = itemCost;
}

public String getItemName() {
    return ItemName;
}

public void setItemName(String itemName) {
    ItemName = itemName;
}

public String getItemDesc() {
    return ItemDesc;
}

public void setItemDesc(String itemDesc) {
    ItemDesc = itemDesc;
}

public Long getItemCals() {
    return ItemCals;
}

public void setItemCals(Long itemCals) {
    ItemCals = itemCals;
}

public Double getItemCost() {
    return ItemCost;
}

public void setItemCost(Double itemCost) {
    ItemCost = itemCost;
}

}

标签: javaandroidfirebasegoogle-cloud-firestore

解决方案


要获得您所说的总数,请使用以下代码:

userMenuRef.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
    @Override
    public void onComplete(@NonNull Task<QuerySnapshot> task) {
        if (task.isSuccessful()) {
            double total = 0;
            for (QueryDocumentSnapshot document : task.getResult()) {
                double itemCost = document.getDouble("itemCost");
                total += itemCost;
            }
            Log.d("TAG", String.valueOf(total));
        }
    }
});

输出将是itemCost文档中存在的所有属性的总和。

另一种方法是随着时间的推移保持一个运行总计,因为每个新价格都是已知的。然后,您可以在需要时在另一个文档中查询该运行总计。


推荐阅读