我有2辆推车,一辆有收入,一辆有费用。收入数据显示在Firebase和我的应用程序中。仅在Firebase中可见的费用数据,在应用程序中不可见。有一些代码: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文件:
<?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>
和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();
}
}
和IncomeFragment(核心地工作)进行比较:
///**
// * 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);
我没有收到任何错误...我可以在firebase数据库中看到费用数据,但在应用程序中看不到。不要关注“总计”片段中的差异,因为没有这些,费用数据应该是可见的。
感谢您的任何帮助。
在此行之后:
recyclerView.setAdapter(firebaseRecyclerAdapter);
粘贴此:
firebaseRecyclerAdapter.startListening();
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句