首页 > 解决方案 > 如何在片段上修复我的 FirebaseRecyclerAdapter?

问题描述

我正在开发此应用程序,并试图在我的个人片段中显示我的“费用”数据库数据。我创建了一个回收站视图文件来替换默认布局。我正在努力完成这项工作。任何人都可以帮助 FirebaseRecycler 适配器和持有者类吗?我无法完成这项工作,我的片段显示没有信息的默认布局。我已经尝试并遵循一些代码,但它不起作用。

这是我的个人片段,应该出现回收站视图

package uk.brighton.ama75.project;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Adapter;
import android.widget.TextView;


import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.firebase.ui.database.FirebaseRecyclerOptions;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.Query;


import java.time.chrono.JapaneseDate;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

public class personalFragment extends Fragment {

    private FirebaseAuth mAuth;
    private String currentUserID;
    private DatabaseReference databaseReference;
    private RecyclerView recyclerView;
    private Adapter adapter;


    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View myView = inflater.inflate(R.layout.fragment_personal, container, false);


        mAuth = FirebaseAuth.getInstance();
        currentUserID = mAuth.getCurrentUser().getUid();
        databaseReference = FirebaseDatabase.getInstance().getReference().child("Expenses").child(currentUserID);

        recyclerView = myView.findViewById(R.id.recycler_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();



        Query query = FirebaseDatabase.getInstance()
                .getReference()
                .child("expenses")
                .limitToLast(5);

        FirebaseRecyclerOptions<PersonalExpenses> options =
                new FirebaseRecyclerOptions.Builder<PersonalExpenses>()
                        .setQuery(query, PersonalExpenses.class)
                        .build();


        FirebaseRecyclerAdapter adapter = new FirebaseRecyclerAdapter<PersonalExpenses, MyViewHolder>(options) {
            @Override
            protected void onBindViewHolder(@NonNull MyViewHolder holder, int position, @NonNull PersonalExpenses model) {


                holder.setDate(model.getDate());
                holder.setDescription(model.getDescription());
                holder.setAmount(model.getAmount());
                holder.setType(model.getType());

            }

            @NonNull
            @Override
            public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                View view = LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.expense_recycler, parent, false);
                return new MyViewHolder(view);
            }
        };
        recyclerView.setAdapter(adapter);
    }


    @Override
    public void onStop() {

        super.onStop();
    }


   public static class MyViewHolder extends RecyclerView.ViewHolder {

        private final View mView;

        public MyViewHolder(View itemView) {
            super(itemView);
            mView = itemView;
        }

        private void setDate(String date) {
            TextView mDate = mView.findViewById(R.id.date_income);
            mDate.setText(date);
        }

        private void setType(String type) {
            TextView mType = mView.findViewById(R.id.type_txt);
            mType.setText(type);
        }

        private void setDescription(String description) {
            TextView mNote = mView.findViewById(R.id.note_txt);
            mNote.setText(description);
        }

        private void setAmount(String amount) {
            TextView mAmount = mView.findViewById(R.id.amount_income);
            String stramount = String.valueOf(amount);
            mAmount.setText(stramount);
        }
    }
}

这是费用回收者视图文件

<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/expense_recycler"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:elevation="5dp"
    app:cardElevation="5dp">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:orientation="horizontal">


        <RelativeLayout
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1">

            <TextView
                android:id="@+id/date_income"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="6 June 2019"
                android:textAppearance="?android:textAppearanceSmall"
                android:textStyle="bold" />


        </RelativeLayout>

        <RelativeLayout
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="2">

            <TextView
                android:id="@+id/type_txt"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:maxLines="1"
                android:text="Type"
                android:textAlignment="center"
                android:textAppearance="?android:textAppearanceSmall"
                android:textStyle="bold" />

            <TextView
                android:id="@+id/note_txt"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_below="@+id/type_txt"
                android:text="@string/description"
                android:textAlignment="center"
                android:textAppearance="?android:textAppearanceSmall"
                android:textStyle="bold" />


        </RelativeLayout>

        <RelativeLayout
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="3
">

            <TextView
                android:id="@+id/amount_income"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="0000"
                android:textAlignment="center"
                android:textAppearance="?android:textAppearanceSmall"
                android:textStyle="bold" />


        </RelativeLayout>

    </LinearLayout>


</androidx.cardview.widget.CardView>

这是个人布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:background="#FFF1F3FC"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <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"
                tools:ignore="Suspicious0dp">

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textAppearance="?android:textAppearanceMedium"
                    android:textColor="@android:color/black"
                    android:id="@+id/expenses"
                    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"
                tools:ignore="Suspicious0dp">

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:id="@+id/expense_txt"
                    android:textAppearance="?android:textAppearanceMedium"
                    android:textColor="@android:color/black"
                    android:text="000.00"/>

            </RelativeLayout>

        </LinearLayout>
        
    </androidx.cardview.widget.CardView>

    <androidx.recyclerview.widget.RecyclerView
        android:layout_width="match_parent"
        android:id="@+id/recycler_expense"
        android:layout_height="match_parent"/>

</LinearLayout>

标签: javaandroidfirebase

解决方案


我相信您缺少这两个主要代码。

adapter.startListening()在 onStart() 里面设置

adapter.stopListening()在 onStop() 内部设置

确保将代码放在 onStart() 的范围结束之前,因为您正在执行大量操作并在上面设置适配器。


推荐阅读