简体   繁体   English

从 firebase 检索到的数据未显示在 recyclerview 中

[英]Data retrieved from firebase not showing up in recyclerview

I am fairly new in android studio.我是 android 工作室的新人。 So when I click on the floating action button, put in new data, it stores the data in my firebase database but displays blank screen and a notification that "budget item added successfully" and the app does not crash either.因此,当我单击浮动操作按钮并输入新数据时,它会将数据存储在我的 firebase 数据库中,但会显示空白屏幕和“预算项目添加成功”的通知,而且应用程序也不会崩溃。 I'm not sure what I did wrong in the code or maybe the codes were not properly typed.我不确定我在代码中做错了什么,或者代码输入不正确。 Any help would be appreciated very much.非常感谢任何帮助。

Activity class.活动 class。

public class TodaySpendingActivity extends AppCompatActivity {

    private Toolbar toolbar;
    private TextView totalAmountSpentOn;
    private ProgressBar progressBar;
    private RecyclerView recyclerView;
    private FloatingActionButton fab;
    private ProgressDialog loader;
    private FirebaseAuth mAuth;
    private String onlineUserId = "";
    private DatabaseReference expensesRef;
    private TodayItemAdapter todayItemAdapter;
    private List<Data> myDataList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_daily_spending);
        toolbar = findViewById(R.id.toolbar);
        setSupportActionBar((androidx.appcompat.widget.Toolbar)toolbar);
        getSupportActionBar().setTitle("Today's Spending");
        totalAmountSpentOn = findViewById(R.id.totalAmountSpentOn);
        progressBar = findViewById(R.id.progressBar);
        fab = findViewById(R.id.fab);
        loader = new ProgressDialog(this);

        mAuth = FirebaseAuth.getInstance();
        onlineUserId = mAuth.getCurrentUser().getUid();
        expensesRef = FirebaseDatabase.getInstance().getReference("expenses").child(onlineUserId);

        recyclerView = findViewById(R.id.recyclerView);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        linearLayoutManager.setStackFromEnd(true);
        linearLayoutManager.setReverseLayout(true);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(linearLayoutManager);

        myDataList = new ArrayList<>();
        todayItemAdapter = new TodayItemAdapter( TodaySpendingActivity.this, myDataList);
        recyclerView.setAdapter(todayItemAdapter);

        readItems();

        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                addItemSpentOn();
            }

            private void addItemSpentOn() {
                AlertDialog.Builder myDialog = new AlertDialog.Builder(TodaySpendingActivity.this);
                LayoutInflater inflater = LayoutInflater.from(TodaySpendingActivity.this);
                View myView = inflater.inflate(R.layout.input_layout, null);
                myDialog.setView(myView);

                final AlertDialog dialog = myDialog.create();
                dialog.setCancelable(false);
                final Spinner itemSpinner = myView.findViewById(R.id.itemspinner);
                final EditText amount = myView.findViewById(R.id.amount);
                final EditText note = myView.findViewById(R.id.note);
                final Button cancel = myView.findViewById(R.id.cancel);
                final Button save = myView.findViewById(R.id.save);

                note.setVisibility(View.VISIBLE);

                save.setOnClickListener(view -> {

                    String Amount = amount.getText().toString();
                    String Item = itemSpinner.getSelectedItem().toString();
                    String notes = note.getText().toString();

                    if(TextUtils.isEmpty(Amount)){
                        amount.setError("Please input an amount!");
                        return;
                    }

                    if (Item.equals("Select item")){
                        Toast.makeText(TodaySpendingActivity.this,"Select a valid item", Toast.LENGTH_SHORT).show();
                    }

                    if (TextUtils.isEmpty(notes)){
                        note.setError("Note is Requires");
                        return;
                    }

                    else {
                        loader.setMessage("Adding a budget item");
                        loader.setCanceledOnTouchOutside(false);
                        loader.show();

                        String id = expensesRef.push().getKey();
                        DateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
                        Calendar cal = Calendar.getInstance();
                        String date = dateFormat.format(cal.getTime());

                        MutableDateTime epoch = new MutableDateTime();
                        epoch.setDate(0);
                        DateTime now = new DateTime();
                        Months months = Months.monthsBetween(epoch, now);

                        Data data = new Data(Item, date, id, notes, Integer.parseInt(Amount), months.getMonths());
                        expensesRef.child(id).setValue(data).addOnCompleteListener(new OnCompleteListener<Void>() {
                            @Override
                            public void onComplete(@NonNull Task<Void> task) {
                                if (task.isSuccessful()) {
                                    Toast.makeText(TodaySpendingActivity.this, "Budget item added successfully", Toast.LENGTH_SHORT).show();
                                }else{
                                    Toast.makeText(TodaySpendingActivity.this, task.getException().toString(), Toast.LENGTH_SHORT).show();

                                }
                                loader.dismiss();
                            }

                        });
                    }
                    dialog.dismiss();
                });

                cancel.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        dialog.dismiss();
                    }
                });

                dialog.show();
            }
        });
    }

    private void readItems() {
        Query query = expensesRef.orderByChild("month").equalTo(new DateTime().getMonthOfYear());
        query.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                myDataList.clear();
                for (DataSnapshot ds: snapshot.getChildren()){
                    Data data = ds.getValue(Data.class);
                    myDataList.add(data);
                }
                todayItemAdapter.notifyDataSetChanged();
                progressBar.setVisibility(View.GONE);
                int totalAmount = 0;
                for (int i = 0; i < myDataList.size(); i++){
                    totalAmount += myDataList.get(i).getAmount();
                    String stTotal = String.valueOf(totalAmount);
                    totalAmountSpentOn.setText(stTotal);
                }
            }

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

            }
        });

    }


}

Adapter Class.适配器 Class。

public class TodayItemAdapter extends RecyclerView.Adapter<TodayItemAdapter.ViewHolder>{

    private Context mContext;
    private List<Data> myDataList;
    private String post_key= "";
    private String item= "";
    private String note="";
    private int amount = 0;
    public TodayItemAdapter(Context mContext, List<Data> myDataList) {
        this.mContext = mContext;
        this.myDataList = myDataList;
    }

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

        View view = LayoutInflater.from(mContext).inflate(R.layout.retrieve_layout, parent, false);
        return new TodayItemAdapter.ViewHolder(view);

    }

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

        final Data data = myDataList.get(position);

        holder.item.setText("Item: "+ data.getItem());
        holder.amount.setText("Amount: "+ data.getAmount());
        holder.date.setText("On: "+ data.getDate());
        holder.note.setText("Note: "+ data.getNotes());

        switch (data.getItem()){
            case "Transport":
                holder.imageView.setImageResource(R.drawable.ic_transport);
                break;
            case "Food":
                holder.imageView.setImageResource(R.drawable.ic_food);
                break;
            case "House":
                holder.imageView.setImageResource(R.drawable.ic_house);
                break;
            case "Entertainment":
                holder.imageView.setImageResource(R.drawable.ic_entertainment);
                break;
            case "Education":
                holder.imageView.setImageResource(R.drawable.ic_education);
                break;
            case "Charity":
                holder.imageView.setImageResource(R.drawable.ic_charity);
                break;
            case "Clothing":
                holder.imageView.setImageResource(R.drawable.ic_clothing);
                break;
            case "Health":
                holder.imageView.setImageResource(R.drawable.ic_health);
                break;
            case "Personal":
                holder.imageView.setImageResource(R.drawable.ic_personal);
                break;
            case "Other":
                holder.imageView.setImageResource(R.drawable.ic_other);
                break;
        }

    }

    @Override
    public int getItemCount() {

        return myDataList.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder{

        public TextView item, amount, date, note;
        public ImageView imageView;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);

            item = itemView.findViewById(R.id.item);
            amount = itemView.findViewById(R.id.amount);
            date = itemView.findViewById(R.id.date);
            note = itemView.findViewById(R.id.note);
            imageView = itemView.findViewById(R.id.imageView);


        }
    }


}

First check addValueEventListener is called when new data is stored首先检查存储新数据时调用addValueEventListener

if yes then change code as mentioned below and try again如果是,则如下所述更改代码,然后重试

in readItems method在 readItems 方法中

From

todayItemAdapter.notifyDataSetChanged();

To

todayItemAdapter.addData(myDataList);

add method in TodayItemAdapter class as mentioned belowTodayItemAdapter class 中添加方法,如下所述

public void addData(List< Data> list){
    myDataList.addAll(list);
    notifyDataSetChanged();
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM