2021年1月20日星期三

Why data is not showing in my app, when I can see it in Firebase?

I have 2 carts, one with income and one with expense. Income data is showing in firebase and in my app. Expense data in only visible in firebase, not in app. There is some code: ExpenseFragment:

 ///**      // * A simple {@link Fragment} subclass.      // * Use the {@link ExpenseFragment#newInstance} factory method to      // * create an instance of this fragment.      // */      public class ExpenseFragment extends Fragment {                private FirebaseAuth mAuth;          private DatabaseReference mExpenseDatabase;                private RecyclerView recyclerView;            //    // TODO: Rename parameter arguments, choose names that match      //    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER          private static final String ARG_PARAM1 = "param1";          private static final String ARG_PARAM2 = "param2";      //      //    // TODO: Rename and change types of parameters          private String mParam1;          private String mParam2;      //          public ExpenseFragment() {              // Required empty public constructor          }      //          /**           * Use this factory method to create a new instance of           * this fragment using the provided parameters.           *           * @param param1 Parameter 1.           * @param param2 Parameter 2.           * @return A new instance of fragment ExpenseFragment.           */          // TODO: Rename and change types and number of parameters         /** public static ExpenseFragment newInstance(String param1, String param2) {             * ExpenseFragment fragment = new ExpenseFragment();             * Bundle args = new Bundle();             * args.putString(ARG_PARAM1, param1);             * args.putString(ARG_PARAM2, param2);             * fragment.setArguments(args);             * return fragment;          }          */                @Override          public void onCreate(Bundle savedInstanceState) {              super.onCreate(savedInstanceState);           /**   if (getArguments() != null) {                 // mParam1 = getArguments().getString(ARG_PARAM1);                 // mParam2 = getArguments().getString(ARG_PARAM2);              } */          }                @Override          public View onCreateView(LayoutInflater inflater, ViewGroup container,                                   Bundle savedInstanceState) {              // Inflate the layout for this fragment              View myview= inflater.inflate(R.layout.fragment_expense, container, false);                    mAuth=FirebaseAuth.getInstance();                    FirebaseUser mUser = mAuth.getCurrentUser();              String uid=mUser.getUid();                    mExpenseDatabase= FirebaseDatabase.getInstance().getReference().child("ExpenseData").child(uid);                    recyclerView=myview.findViewById(R.id.recycler_id_expense);                    LinearLayoutManager layoutManager=new LinearLayoutManager(getActivity());                    layoutManager.setStackFromEnd(true);              layoutManager.setReverseLayout(true);              recyclerView.setHasFixedSize(true);              recyclerView.setLayoutManager(layoutManager);                    return myview;          }                @Override          public void onStart() {              super.onStart();                    FirebaseRecyclerOptions<Data> options=                      new FirebaseRecyclerOptions.Builder<Data>()                              .setQuery(mExpenseDatabase,Data.class)                              .setLifecycleOwner(this)                              .build();              FirebaseRecyclerAdapter<Data, MyViewHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Data, MyViewHolder>(options) {                  @NonNull                  @Override                  public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {                      return new MyViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.expense_recycler_data,parent,false));                  }                  @Override                  protected void onBindViewHolder(@NonNull MyViewHolder holder, int position, @NonNull Data model) {                            holder.setAmount(model.getAmount());                      holder.setType(model.getType());                      holder.setNote(model.getNote());                      holder.setDate(model.getDate());                  }              };              recyclerView.setAdapter(firebaseRecyclerAdapter);                }                public static class MyViewHolder extends  RecyclerView.ViewHolder {              View mView;                    public MyViewHolder(View itemView){                  super(itemView);                  mView=itemView;              }                    private void setDate(String date){                  TextView mDate=mView.findViewById(R.id.date_txt_expense);                  mDate.setText(date);              }                    private void setType(String type){                  TextView mType=mView.findViewById(R.id.type_txt_expense);                  mType.setText(type);              }                    private void setNote(String note){                  TextView mNote=mView.findViewById(R.id.note_txt_expense);                  mNote.setText(note);              }                    private void setAmount(int amount){                  TextView mAmonut=mView.findViewById(R.id.amount_txt_expense);                        String stamount=String.valueOf(amount);                        mAmonut.setText(stamount);              }                }            }  

xml file:

<?xml version="1.0" encoding="utf-8"?>  <LinearLayout      xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:tools="http://schemas.android.com/tools"      android:layout_width="match_parent"      xmlns:app="http://schemas.android.com/apk/res-auto"      android:orientation="vertical"      android:layout_height="match_parent"      tools:context=".ExpenseFragment">        <androidx.cardview.widget.CardView          android:layout_width="match_parent"          app:cardElevation="5dp"          android:elevation="10dp"          android:layout_height="wrap_content">            <LinearLayout              android:layout_width="match_parent"              android:orientation="horizontal"              android:layout_height="wrap_content">                <RelativeLayout                  android:layout_width="0dp"                  android:layout_weight="1"                  android:gravity="center"                  android:layout_margin="10dp"                  android:layout_height="wrap_content">                    <TextView                      android:layout_width="wrap_content"                      android:layout_height="wrap_content"                      android:textAppearance="?android:textAppearanceMedium"                      android:textColor="@android:color/black"                      android:text="expense"/>                        </RelativeLayout>                <RelativeLayout                  android:layout_width="0dp"                  android:layout_weight="3"                  android:gravity="center"                  android:layout_margin="10dp"                  android:layout_height="wrap_content">                    <TextView                      android:layout_width="wrap_content"                      android:layout_height="wrap_content"                      android:id="@+id/expense_txt_result"                      android:textAppearance="?android:textAppearanceMedium"                      android:textColor="@android:color/black"                      android:text="00.00"/>                  </RelativeLayout>              </LinearLayout>          </androidx.cardview.widget.CardView>        <androidx.recyclerview.widget.RecyclerView          android:layout_width="match_parent"          android:id="@+id/recycler_id_expense"          android:layout_height="match_parent">        </androidx.recyclerview.widget.RecyclerView>    </LinearLayout>  

and DashBoardFragment:

///**  // * A simple {@link Fragment} subclass.  // * Use the {@link DashBoardFragment#newInstance} factory method to  // * create an instance of this fragment.  // */  public class DashBoardFragment extends Fragment {        private FloatingActionButton fab_main_btn;      private FloatingActionButton fab_income_btn;      private FloatingActionButton fab_expense_btn;          //Textview        private TextView fab_income_txt;      private TextView fab_expense_txt;          private boolean isOpen = false;        //animation        private Animation FadeOpen, FadeClose;        //Firebase        private FirebaseAuth mAuth;      private DatabaseReference mIncomeDatabase;      private DatabaseReference mExpenseDatabase;          // TODO: Rename parameter arguments, choose names that match      // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER      private static final String ARG_PARAM1 = "param1";      private static final String ARG_PARAM2 = "param2";        // TODO: Rename and change types of parameters      private String mParam1;      private String mParam2;        public DashBoardFragment() {          // Required empty public constructor      }    //    /**  //     * Use this factory method to create a new instance of  //     * this fragment using the provided parameters.  //     *  //     * @param param1 Parameter 1.  //     * @param param2 Parameter 2.  //     * @return A new instance of fragment DashBoardFragment.  //     */      // TODO: Rename and change types and number of parameters  //    public static DashBoardFragment newInstance(String param1, String param2) {  //        DashBoardFragment fragment = new DashBoardFragment();  //        Bundle args = new Bundle();  //        args.putString(ARG_PARAM1, param1);  //        args.putString(ARG_PARAM2, param2);  //        fragment.setArguments(args);  //        return fragment;  //    }        @Override      public void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);  //        if (getArguments() != null) {  //            mParam1 = getArguments().getString(ARG_PARAM1);  //            mParam2 = getArguments().getString(ARG_PARAM2);  //        }      }        @Override      public View onCreateView(LayoutInflater inflater, ViewGroup container,                               Bundle savedInstanceState) {          // Inflate the layout for this fragment          View myview = inflater.inflate(R.layout.fragment_dash_board, container, false);            mAuth = FirebaseAuth.getInstance();            FirebaseUser mUser = mAuth.getCurrentUser();            String uid = mUser.getUid();            mIncomeDatabase = FirebaseDatabase.getInstance().getReference().child("IncomeData").child(uid);          mExpenseDatabase = FirebaseDatabase.getInstance().getReference().child("ExpenseData").child(uid);            //połączenie z layoutem floating button            fab_main_btn = myview.findViewById(R.id.fb_main_plus_btn);          fab_income_btn = myview.findViewById(R.id.income_ft_btn);          fab_expense_btn = myview.findViewById(R.id.expense_ft_btn);            //floating text            fab_income_txt = myview.findViewById(R.id.income_ft_text);          fab_expense_txt = myview.findViewById(R.id.expense_ft_text);              //anim connect            FadeOpen = AnimationUtils.loadAnimation(getActivity(), R.anim.fade_open);          FadeClose = AnimationUtils.loadAnimation(getActivity(), R.anim.fade_close);              fab_main_btn.setOnClickListener(new View.OnClickListener() {              @Override              public void onClick(View view) {                    addData();                    if (isOpen) {                      fab_income_btn.startAnimation(FadeClose);                      fab_expense_btn.startAnimation(FadeClose);                      fab_income_btn.setClickable(false);                      fab_expense_btn.setClickable(false);                        fab_income_txt.startAnimation(FadeClose);                      fab_expense_txt.startAnimation(FadeClose);                      fab_income_txt.setClickable(false);                      fab_expense_txt.setClickable(false);                      isOpen = false;                  } else {                      fab_income_btn.startAnimation(FadeOpen);                      fab_expense_btn.startAnimation(FadeOpen);                      fab_income_btn.setClickable(true);                      fab_expense_btn.setClickable(true);                        fab_income_txt.startAnimation(FadeOpen);                      fab_expense_txt.startAnimation(FadeOpen);                      fab_income_txt.setClickable(true);                      fab_expense_txt.setClickable(true);                      isOpen = true;                    }                }          });              return myview;      }        private void ftAnimation(){          if (isOpen) {              fab_income_btn.startAnimation(FadeClose);              fab_expense_btn.startAnimation(FadeClose);              fab_income_btn.setClickable(false);              fab_expense_btn.setClickable(false);                fab_income_txt.startAnimation(FadeClose);              fab_expense_txt.startAnimation(FadeClose);              fab_income_txt.setClickable(false);              fab_expense_txt.setClickable(false);              isOpen = false;          } else {              fab_income_btn.startAnimation(FadeOpen);              fab_expense_btn.startAnimation(FadeOpen);              fab_income_btn.setClickable(true);              fab_expense_btn.setClickable(true);                fab_income_txt.startAnimation(FadeOpen);              fab_expense_txt.startAnimation(FadeOpen);              fab_income_txt.setClickable(true);              fab_expense_txt.setClickable(true);              isOpen = true;            }      }          private void addData() {            fab_income_btn.setOnClickListener(new View.OnClickListener() {              @Override              public void onClick(View v) {                    incomeDataInsert();                }          });            fab_expense_btn.setOnClickListener(new View.OnClickListener() {              @Override              public void onClick(View v) {                    expenseDataInsert();                }          });        }          public void incomeDataInsert() {            AlertDialog.Builder mydialog = new AlertDialog.Builder(getActivity());          LayoutInflater inflater = LayoutInflater.from(getActivity());          View myview = inflater.inflate(R.layout.custom_layout_for_insertdata, null);          mydialog.setView(myview);            final AlertDialog dialog = mydialog.create();                dialog.setCancelable(false);          final EditText edtAmount = myview.findViewById(R.id.amount_edt);          final EditText edtType = myview.findViewById(R.id.typ_edt);          final EditText edtNote = myview.findViewById(R.id.note_edt);            Button btnSave = myview.findViewById(R.id.btnSave);          Button btnCancel = myview.findViewById(R.id.btnCancel);            btnSave.setOnClickListener(new View.OnClickListener() {              @Override              public void onClick(View v) {                    String type = edtType.getText().toString().trim();                  String amount = edtAmount.getText().toString().trim();                  String note = edtNote.getText().toString().trim();                    if (TextUtils.isEmpty(type)) {                      edtType.setError("Field required");                      return;                  }                    if (TextUtils.isEmpty(amount)) {                      edtAmount.setError("Field required");                      return;                  }                    int ouramountint = Integer.parseInt(amount);                    if (TextUtils.isEmpty(note)) {                      edtNote.setError("Field required");                      return;                  }                    String id = mIncomeDatabase.push().getKey();                  String mDate = DateFormat.getDateInstance().format(new Date());                    Data data = new Data(ouramountint, type, note, id, mDate);                    mIncomeDatabase.child(id).setValue(data);                  Toast.makeText(getActivity(), "Data Added", Toast.LENGTH_SHORT).show();                    ftAnimation();                  dialog.dismiss();                  }          });            btnCancel.setOnClickListener(new View.OnClickListener() {              @Override              public void onClick(View v) {                  ftAnimation();                  dialog.dismiss();              }          });          dialog.show();      }        public void expenseDataInsert() {          AlertDialog.Builder mydialog = new AlertDialog.Builder(getActivity());          LayoutInflater inflater = LayoutInflater.from(getActivity());          View myview = inflater.inflate(R.layout.custom_layout_for_insertdata, null);          mydialog.setView(myview);           final AlertDialog dialog =mydialog.create();            dialog.setCancelable(false);           final EditText amount = myview.findViewById(R.id.amount_edt);         final EditText type = myview.findViewById(R.id.typ_edt);         final EditText note = myview.findViewById(R.id.note_edt);            Button btnSave = myview.findViewById(R.id.btnSave);          Button btnCancel = myview.findViewById(R.id.btnCancel);            btnSave.setOnClickListener(new View.OnClickListener() {              @Override              public void onClick(View v) {                    String tmAmount=amount.getText().toString().trim();                  String tmtype=type.getText().toString().trim();                  String tmnote=note.getText().toString().trim();                    if (TextUtils.isEmpty(tmAmount)){                      amount.setError("Required field");                      return;                  }                    int inamount=Integer.parseInt(tmAmount);                    if (TextUtils.isEmpty(tmtype)){                      type.setError("Required field");                      return;                  }                  if (TextUtils.isEmpty(tmnote)){                      note.setError("Required field");                      return;                  }                    String id=mExpenseDatabase.push().getKey();                  String mDate=DateFormat.getDateInstance().format(new Date());                    Data data=new Data(inamount,tmtype,tmnote,id,mDate);                  mExpenseDatabase.child(id).setValue(data);                    Toast.makeText(getActivity(),"Data added",Toast.LENGTH_SHORT).show();                    ftAnimation();                  dialog.dismiss();                }          });        btnCancel.setOnClickListener(new View.OnClickListener() {          @Override          public void onClick(View v) {              ftAnimation();              dialog.dismiss();          }      });        dialog.show();        }    }  

And IncomeFragment (working corectly) for comparison:

///**  // * A simple {@link Fragment} subclass.  // * Use the {@link IncomeFragment#newInstance} factory method to  // * create an instance of this fragment.  // */  public class IncomeFragment extends Fragment {       //Database        private FirebaseAuth mAuth;      private DatabaseReference mIncomeDatabase;        //Recyvlerview        private RecyclerView recyclerView;        private TextView incomeTotalSum;          // TODO: Rename parameter arguments, choose names that match      // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER      private static final String ARG_PARAM1 = "param1";      private static final String ARG_PARAM2 = "param2";        // TODO: Rename and change types of parameters      private String mParam1;      private String mParam2;        public IncomeFragment() {          // Required empty public constructor      }        /**       * Use this factory method to create a new instance of       * this fragment using the provided parameters.       *       * @param param1 Parameter 1.       * @param param2 Parameter 2.       * @return A new instance of fragment IncomeFragment.       */      // TODO: Rename and change types and number of parameters        /**       * public static IncomeFragment newInstance(String param1, String param2) {       * IncomeFragment fragment = new IncomeFragment();       * Bundle args = new Bundle();       * args.putString(ARG_PARAM1, param1);       * args.putString(ARG_PARAM2, param2);       * fragment.setArguments(args);       * return fragment;       * }       */        @Override      public void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          /**if (getArguments() != null) {           //mParam1 = getArguments().getString(ARG_PARAM1);           //mParam2 = getArguments().getString(ARG_PARAM2);           }*/      }        @Override      public View onCreateView(LayoutInflater inflater, ViewGroup container,                               Bundle savedInstanceState) {          // Inflate the layout for this fragment          View myview= inflater.inflate(R.layout.fragment_income, container, false);            mAuth = FirebaseAuth.getInstance();          FirebaseUser mUser=mAuth.getCurrentUser();          String uid=mUser.getUid();              mIncomeDatabase= FirebaseDatabase.getInstance().getReference().child("IncomeData").child(uid);            incomeTotalSum=myview.findViewById(R.id.income_txt_result);            recyclerView=myview.findViewById(R.id.recycler_id_income);            LinearLayoutManager layoutManager=new LinearLayoutManager(getActivity());            layoutManager.setReverseLayout(true);          layoutManager.setStackFromEnd(true);          recyclerView.setHasFixedSize(true);          recyclerView.setLayoutManager(layoutManager);              mIncomeDatabase.addValueEventListener(new ValueEventListener() {              @Override              public void onDataChange(@NonNull DataSnapshot dataSnapshot) {                    int totalvalue = 0;                    for (DataSnapshot mysnapshot:dataSnapshot.getChildren()){                      Data data=mysnapshot.getValue(Data.class);                      totalvalue+=data.getAmount();                        String stTotalvalue=String.valueOf(totalvalue);                        incomeTotalSum.setText(stTotalvalue);                  }              }                  @Override              public void onCancelled(@NonNull DatabaseError databaseError) {                }          });            return myview;      }        @Override      public void onStart() {          super.onStart();            FirebaseRecyclerOptions<Data> options=                  new FirebaseRecyclerOptions.Builder<Data>()                          .setQuery(mIncomeDatabase,Data.class)                          .setLifecycleOwner(this)                          .build();          FirebaseRecyclerAdapter<Data, MyViewHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Data, MyViewHolder>(options) {              @NonNull              @Override              public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {                  return new MyViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.income_recycler_data,parent,false));              }              @Override              protected void onBindViewHolder(@NonNull MyViewHolder holder, int position, @NonNull Data model) {                    holder.setAmount(model.getAmount());                  holder.setType(model.getType());                  holder.setNote(model.getNote());                  holder.setDate(model.getDate());              }          };          recyclerView.setAdapter(firebaseRecyclerAdapter);      }               public static class MyViewHolder extends RecyclerView.ViewHolder {                View mView;                public MyViewHolder(@NonNull View itemView) {                  super(itemView);                  mView = itemView;              }                private void setType(String type) {                  TextView mType = mView.findViewById(R.id.type_txt_income);                  mType.setText(type);              }                private void setNote(String note) {                  TextView mNote = mView.findViewById(R.id.note_txt_income);                  mNote.setText(note);              }                private void setDate(String date) {                  TextView mDate = mView.findViewById(R.id.date_txt_income);                  mDate.setText(date);              }                private void setAmount(int amount) {                  TextView mAmount = mView.findViewById(R.id.amount_txt_income);                  String stamount = String.valueOf(amount);                  mAmount.setText(stamount);  

I'm not getting any error... I can see expense data in firebase database, but not in app. Don't focus on difference in "totalamount" fragment, because expense data should be visible without this.

Thank you for any help.

https://stackoverflow.com/questions/65812022/why-data-is-not-showing-in-my-app-when-i-can-see-it-in-firebase January 20, 2021 at 10:57PM

没有评论:

发表评论