【问题标题】:Failed to Sum up the recyclerview items value无法汇总 recyclerview items 值
【发布时间】:2021-05-12 20:05:44
【问题描述】:

我对 Android Studio 完全陌生。 我为预算创建了recycleview。我为每个项目创建了预算描述和预算值。 我试图总结recyclerview的所有价值。我一夜之间尝试了不同的方法,但没有成功。请帮忙!!!

适配器:

 package com.example.personalwallet.Adapter;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.cardview.widget.CardView;
import androidx.recyclerview.widget.RecyclerView;

import com.example.personalwallet.Model.Budget;
import com.example.personalwallet.R;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;

import java.util.ArrayList;

public class recyclerAdapter extends RecyclerView.Adapter<recyclerAdapter.MyViewHolder> {
    private ArrayList<Budget> userlist;
    private DatabaseReference databaseReference;
    private String uId;
    int sum=0;

    public recyclerAdapter(ArrayList<Budget> userlist,String uId){
        this.userlist=userlist;
        this.uId = uId;
        databaseReference = FirebaseDatabase.getInstance().getReference().child("Users").child(uId).child("Budget");
    }


    public class MyViewHolder extends RecyclerView.ViewHolder{
        private TextView nameTxt,amountTXT;
        CardView rootCardView;
        ImageView deleteSupplierIV;

        public MyViewHolder(final View view){
            super(view);
            nameTxt = view.findViewById(R.id.name);
            amountTXT = view.findViewById(R.id.value);
            rootCardView = itemView.findViewById(R.id.single_supplier_cardview_id);
            deleteSupplierIV = itemView.findViewById(R.id.delete_supplier_IV);

        }
    }

    @NonNull
    @Override
    public recyclerAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        View itemview = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_items,parent,false);
        return new MyViewHolder(itemview);
    }

    @Override
    public void onBindViewHolder(@NonNull recyclerAdapter.MyViewHolder holder, int position) {
        Budget user = userlist.get(position);
        String name,amount;

        name = user.getBudgetDescription();
        amount = user.getAmount();
        holder.nameTxt.setText(name);
        holder.amountTXT.setText(amount);

        if (user.isVisibilityStatus()){
            holder.deleteSupplierIV.setVisibility(View.GONE);
        }


        holder.rootCardView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                holder.deleteSupplierIV.setVisibility(View.VISIBLE);
                user.setVisibilityStatus(false);
                return true;
            }
        });

        holder.deleteSupplierIV.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                deleteSupplier(user.getBudgetDescription());

            }

            private void deleteSupplier(String supplierName) {
                DatabaseReference productReference = databaseReference.child(supplierName);
                productReference.removeValue();
                userlist.remove(position);
                notifyItemRemoved(position);
                notifyDataSetChanged();
            }


        });

    }


    @Override
    public int getItemCount() {
        return userlist.size();
    }
}



活动代码:

package com.example.personalwallet.NavCategories;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.example.personalwallet.Adapter.recyclerAdapter;
import com.example.personalwallet.AddBudgetActivity;
import com.example.personalwallet.Model.Budget;
import com.example.personalwallet.Prevalent.Prevalent;
import com.example.personalwallet.R;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

import java.util.ArrayList;

public class Budgets extends AppCompatActivity{

    private FloatingActionButton addNewBudgetFAB;
    private ArrayList<Budget> userlist;
    private RecyclerView recyclerView;
    private String uId;
    DatabaseReference databaseReference;
    recyclerAdapter adapter;
    TextView TotalBudgetTv;
    public int total_budget =0;




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

        userlist = new ArrayList<Budget>();
        recyclerView = findViewById(R.id.suppliers_recyclerViewID);
        TotalBudgetTv = findViewById(R.id.TotalBudgetTv);
        uId = Prevalent.currentOnlineUser.getPhone();
         adapter = new recyclerAdapter(userlist,uId);


        setUserInfo();
        setAdapter();


        **for (int i=0; i<userlist.size(); i++){
            total_budget = total_budget+Integer.parseInt(userlist.get(i).getAmount());
        }**

        TotalBudgetTv.setText("Total Budget: " + Integer.toString(total_budget));

        addNewBudgetFAB = findViewById(R.id.addNewSuppliersFABID);


        addNewBudgetFAB.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(Budgets.this, AddBudgetActivity.class);
                startActivity(intent);
            }
        });
    }

    private void setAdapter() {
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        recyclerView.setAdapter(adapter);

    }

    private void setUserInfo() {

        databaseReference = FirebaseDatabase.getInstance().getReference().child("Users").child(uId).child("Budget");

        databaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {

                userlist.clear();
                if (snapshot.exists()) {
                    for (DataSnapshot data : snapshot.getChildren()) {
                        Budget supplier = data.getValue(Budget.class);
                        userlist.add(supplier);
                        adapter.notifyDataSetChanged();
                    }

                }

            }


            @Override
            public void onCancelled(@NonNull DatabaseError error) {

            }
        });
    }

}

这是我的模型类:

package com.example.personalwallet.Model;

public class Budget {
    private String BudgetDescription;
    private String amount;

    public boolean isVisibilityStatus() {
        return visibilityStatus;
    }

    public void setVisibilityStatus(boolean visibilityStatus) {
        this.visibilityStatus = visibilityStatus;
    }

    private boolean visibilityStatus = true;

    public Budget(){}



    public Budget(String budgetDescription, String amount) {
        BudgetDescription = budgetDescription;
        this.amount = amount;
    }

    public String getBudgetDescription() {
        return BudgetDescription;
    }

    public void setBudgetDescription(String budgetDescription) {
        BudgetDescription = budgetDescription;
    }

    public String  getAmount() {
        return amount;
    }

    public void setAmount(String amount) {
        this.amount = amount;
    }
}

【问题讨论】:

    标签: java android-studio android-layout arraylist android-recyclerview


    【解决方案1】:

    尝试将您的 forloop 计算放在 onDataChange 中,因为在 oncreate 方法中,您的 userlist 是空的。因此,当 onDataChange 在添加到用户列表的新值之后调用并在那里计算您的总数。

    databaseReference.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot snapshot) {
    
                    userlist.clear();
                    if (snapshot.exists()) {
                        for (DataSnapshot data : snapshot.getChildren()) {
                            Budget supplier = data.getValue(Budget.class);
                            userlist.add(supplier);
                            adapter.notifyDataSetChanged();
                        }
    
                    
                      for (int i=0; i<userlist.size(); i++)
                       {
                        total_budget = total_budget+Integer.parseInt(userlist.get(i).getAmount());
                       }
                       TotalBudgetTv.setText("Total Budget: " + Integer.toString(total_budget));
                    }
                }
    
    
                @Override
                public void onCancelled(@NonNull DatabaseError error) {
    
                }
            });
    

    【讨论】:

    • #Jatin k。先生,onDataChange 方法位于在 forloop 之前调用的 SetUserInfo 方法中。我按照你说的做了相应的尝试,但失败了。 Arraylist 的大小一直为空,但 recycleView 工作正常
    • @MDNaimulPathan 你的recyclerview显示成功了吗?
    • 请将总和计算放在if (snapshot.exists()) {} 方法中,编辑后的答案请检查,如果仍然不起作用,请将总和计算放在下面adapter.notifyDataSetChanged();
    • so in snapshot.exists() 如果数据存在,则添加您的用户列表并显示 recyclerview,并且还显示您的总和计算
    【解决方案2】:

    在适配器的构造函数中,您将获得包含所有数据的 ArrayList。在这里,您可以运行 for 循环。它将逐个读取每个对象并相加。

    public recyclerAdapter(ArrayList<Budget> userlist, String uId){
        this.userlist=userlist;
        this.uId = uId;
        databaseReference = FirebaseDatabase.getInstance().getReference().child("Users").child(uId).child("Budget");
        for(int i = 0; i<userlist.size(); i++){
            Budget user = userlist.get(i);
            sum = sum + user.getAmount();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-20
      • 2016-04-16
      • 2014-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多