当我可以在Firebase中看到费用数据时,为什么我的应用程序中未显示费用数据?

Raf1k

我有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数据库中看到费用数据,但在应用程序中看不到。不要关注“总计”片段中的差异,因为没有这些,费用数据应该是可见的。

感谢您的任何帮助。

oop

在此行之后:

recyclerView.setAdapter(firebaseRecyclerAdapter);

粘贴此:

firebaseRecyclerAdapter.startListening();

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么数据没有显示在我的应用程序中,而我可以在 Firebase 中看到它?

当我更改数据库时,为什么我的 React 应用程序在 useEffect 中运行 firebase 查询?

我可以看到布局的预览,但是当我运行应用程序时,布局未显示

为什么我可以在一个应用程序中看到我的网站,而在另一个应用程序中却看不到?

为什么当我尝试显示我的 ip usig Inet 时我的应用程序崩溃?

当我的应用程序运行时,为什么在Android Studio Logcat中看到“没有可调试的应用程序”?

为什么我的 addListenerForSingleValueEvent 停止从 android 应用程序中的 Firebase 数据库读取数据?

为什么当我在物理 Android 设备上安装我的应用程序 APK 时显示未安装应用程序

为什么IntelliJ可以看到我的应用程序上下文,但是当我运行测试时却看不到它?

为什么我可以在 Azure 文档数据库中看到加密的数据?

当我尝试从 SQLite 数据库中删除一行时,为什么我的 android 应用程序崩溃?科特林

当我在我的应用程序中添加 Firebase 实时数据库时它开始崩溃

为什么我无法从Spring Hibernate程序中看到提交到Postgres数据库的数据?

为什么我在React应用程序的HTML输出中看到传递的道具?

为什么我在 Azure 应用程序网关中看到 403 forbidden?

为什么当我将Fragment for Google Maps放到我的应用程序中时

当我获取数据时,我可以看到该状态已设置,但是当我从状态中调用数据时,它显示对象未定义

为什么我的应用程序没有在我的回收站视图中显示数据库中的用户?

当我从EditText中删除所有内容时,为什么应用程序崩溃?

当我在android中按回时为什么不退出该应用程序?

为什么当我按下按钮在表中插入值时应用程序崩溃?

当我尝试从Firebase检索数据库信息时,SwiftUI为什么会显示错误?

当我在 mongo 中显示数据库时,为什么我创建的数据库不显示?

当我单击按钮时刷新整个用户在WinForms应用程序中输入的数据

为什么我在Google Playstore控制台中看到应用程序版本代码为“未知”?

SQlite。当我单击我的保存按钮时,不插入任何数据则显示错误,应用程序未打开..但是当我插入所有字段时其工作正常

每当我在该SetupActivity中单击“保存”按钮时,我的应用就会崩溃。每当我要在Firebase数据库中写入时,我的应用程序崩溃

我的JSON列表未显示在移动应用程序的listview中,为什么?

有什么方法可以让我的应用程序在继续执行代码之前等待从Firebase检索数据?