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
没有评论:
发表评论