我正在尝试显示来自我的 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>
结果:
卡片什么都不显示。
我的数据库:
答案 0 :(得分:0)
您正在尝试访问不直接存在于 Ordini
分支(如 disponibilita
、immagine
)中的节点。如果您在共享图片中注意到,这些节点实际上存在于 Oridni
> 1
节点下。也许将来您会有 2
、3
等的分支。
要解决这个问题,您需要遍历从 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);
}