尝试显示来自 Firebase 的数据,但没有显示

时间:2021-01-03 16:15:21

标签: java android firebase firebase-realtime-database

我正在尝试显示来自我的 Firebase 实时数据库的数据,但没有显示任何内容。日志中没有显示错误。

这是 OrdiniFragment.Java

public class OrdiniFragment extends Fragment {

    private View ordiniView;
    private RecyclerView myOrdiniList;
    private DatabaseReference ordiniRef;

    private FirebaseAuth mAuth;
    private String currentUserID;


    // 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 OrdiniFragment() {
        // 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 OrdiniFragment.
     */
    // TODO: Rename and change types and number of parameters
    public static OrdiniFragment newInstance(String param1, String param2) {
        OrdiniFragment fragment = new OrdiniFragment();
        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
        ordiniView = inflater.inflate(R.layout.fragment_ordini, container, false);

        myOrdiniList = (RecyclerView) ordiniView.findViewById(R.id.ordini_list);
        myOrdiniList.setLayoutManager(new LinearLayoutManager(getContext()));

        

        ordiniRef = FirebaseDatabase.getInstance().getReference().child("Ordini");

        return ordiniView;
    }


    @Override
    public void onStart() {
        super.onStart();

        FirebaseRecyclerOptions options = new FirebaseRecyclerOptions.Builder<Ordini>().setQuery(ordiniRef, Ordini.class).build();

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

                ordiniRef.addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot snapshot) {


                        String availability = snapshot.child("disponibilita").getValue(String.class);
                        String immaggine = snapshot.child("immagine").getValue(String.class);
                        String nome = snapshot.child("nome").getValue(String.class);

                        holder.disponibilita.setText(availability);
                        Picasso.get().load(immaggine).into(holder.image);
                        holder.nomeOggetto.setText(nome); 
                    }

                    @Override
                    public void onCancelled(@NonNull DatabaseError error) {

                    }
                });

            }

            @NonNull
            @Override
            public OrdiniViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

                View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_display_layout, parent, false);
                OrdiniViewHolder viewHolder = new OrdiniViewHolder(view);
                return viewHolder;
            }
        };

        myOrdiniList.setAdapter(adapter);
        adapter.startListening();
    }


    public static class OrdiniViewHolder extends RecyclerView.ViewHolder {

        TextView nomeOggetto, disponibilita;
        ImageView image;

        public OrdiniViewHolder(@NonNull View itemView) {

            super(itemView);

            nomeOggetto = itemView.findViewById(R.id.nome_oggetto);
            disponibilita = itemView.findViewById(R.id.disponibilita);
            image = itemView.findViewById(R.id.image);
        }

    }
}

在这个 Java 中,我也尝试做这样的 toString,但它给了我一个 NullPointerExeption:

    String availability = snapshot.child("disponibilita").getValue().toString;
    String immaggine = snapshot.child("immagine").getValue().toString;
    String nome = snapshot.child("nome").getValue().toString;

这是 Ordini.java

public class Ordini {

    public String nome, immagine;
    public int disponibilita;


    public Ordini() {

    }


    public Ordini(String nome, String immagine, int disponibilita) {
        this.nome = nome;
        this.immagine = immagine;
        this.disponibilita = disponibilita;

    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getImmagine() {
        return immagine;
    }

    public void setImmagine(String immagine) {
        this.immagine = immagine;
    }

    public int getDisponibilita() {
        return disponibilita;
    }

    public void setDisponibilita(int disponibilita) {
        this.disponibilita = disponibilita;
    }
}

这里是fragment_ordini.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".OrdiniFragment">


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

</RelativeLayout>

这是 card_display_layout.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

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


        <androidx.cardview.widget.CardView
            android:layout_width="wrap_content"
            android:layout_height="146dp"
            android:layout_marginLeft="30dp"
            android:layout_marginTop="30dp"
            android:layout_marginRight="30dp"
            android:layout_marginBottom="5dp"
            app:cardCornerRadius="25dp">

            <LinearLayout
                android:layout_width="336dp"
                android:layout_height="wrap_content"
                android:layout_marginLeft="10dp"
                android:layout_marginTop="20dp"
                android:layout_marginRight="5dp"
                android:orientation="horizontal">

                <ImageView
                    android:id="@+id/image"
                    android:layout_width="91dp"
                    android:layout_height="102dp"
                    android:src="@drawable/tv">

                </ImageView>

                <LinearLayout
                    android:layout_width="227dp"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="10dp"
                    android:layout_marginLeft="10dp"
                    android:layout_marginTop="15dp"
                    android:orientation="vertical">


                    <TextView
                        android:id="@+id/nome_oggetto"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginStart="30dp"
                        android:layout_marginLeft="10dp"
                        android:layout_marginTop="5dp"
                        android:text="Nome Oggetto"
                        android:textColor="#F0000000"
                        android:textSize="22dp" />

                    <TextView
                        android:id="@+id/disponibilita"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginStart="30dp"
                        android:layout_marginLeft="10dp"
                        android:layout_marginTop="10dp"
                        android:gravity="right"
                        android:text="Diponibilita"
                        android:textColor="#BE000000"
                        android:textSize="18dp" />


                </LinearLayout>

            </LinearLayout>

        </androidx.cardview.widget.CardView>

    </LinearLayout>

</RelativeLayout>

结果:

It displays only the card

卡片什么都不显示。

我的数据库:

The Database

1 个答案:

答案 0 :(得分:0)

您正在尝试访问不直接存在于 Ordini 分支(如 disponibilitaimmagine)中的节点。如果您在共享图片中注意到,这些节点实际上存在于 Oridni > 1 节点下。也许将来您会有 23 等的分支。

要解决这个问题,您需要遍历从 datasnapshot ValueEventListener 回调收到的 onDataChange 的子代:

ordiniRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot snapshot) {

        for (DataSnapshot singleSnapshot : dataSnapshot.getChildren()) {
            Ordini ordini = singleSnapshot.getValue(Ordini.class);
            
            String availability = ordini.getDisponibilit();
            String immaggine = ordini.getImmagine();
            String nome = ordini.getNome();
            
            holder.disponibilita.setText(availability);
            Picasso.get().load(immaggine).into(holder.image);
            holder.nomeOggetto.setText(nome);
            
        }

    }

    @Override
    public void onCancelled(@NonNull DatabaseError error) {

    }
});

此外,如果您愿意,您可以像以前一样直接从 String 获取 snapshot 值:

for (DataSnapshot singleSnapshot : dataSnapshot.getChildren()) {
    
    String availability = singleSnapshot.child("disponibilita").getValue(String.class);
    String immaggine = singleSnapshot.child("immagine").getValue(String.class);
    String nome = singleSnapshot.child("nome").getValue(String.class);
    
    holder.disponibilita.setText(availability);
    Picasso.get().load(immaggine).into(holder.image);
    holder.nomeOggetto.setText(nome);
    
}