FireBase Recycler Adapter 不从 FireBase 检索数据
FireBase Recycler Adapter doesn't retrieve data from FireBase
我的数据库是这样的
我正在尝试从购物车中的那个用户 ID 获取所有这些数据。但是我的 RecyclerView
什么也没显示。查了一下,adapter.getItemCount()
returns 0。我哪里错了?这是我的代码:
onStart()
private void loadData(){
auth = FirebaseAuth.getInstance().getCurrentUser();
userID = auth.getUid();
final DatabaseReference cartList = FirebaseDatabase.getInstance().getReference().child("Cart");
FirebaseRecyclerOptions<Cart> options =
new FirebaseRecyclerOptions.Builder<Cart>()
.setQuery(cartList.child(userID),Cart.class).build();
FirebaseRecyclerAdapter<Cart,CartHolder> adapter
= new FirebaseRecyclerAdapter<Cart, CartHolder>(options) {
@Override
protected void onBindViewHolder(@NonNull CartHolder holder, int position, @NonNull Cart model) {
holder.txtGia.setText(model.getTotal());
}
@NonNull
@Override
public CartHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.cart_item,parent,false);
CartHolder holder = new CartHolder(view);
return holder;
}
};
recyclerView.setAdapter(adapter);
adapter.startListening();
}
型号
public class Cart {
public String pID,num,time,addr,total,userID;
public Cart(){}
public Cart(String num,String pID,String time,String addr,String total,String userID) {
this.num = num;
this.pID = pID;
this.time = time;
this.addr = addr;
this.total = total;
this.userID = userID;
}
public String getNum() {
return num;
}
public String getpID() {
return pID;
}
public String getTime() {
return time;
}
public String getAddr() {
return addr;
}
public String getTotal() {
return total;
}
public String getUserID() {
return userID;
}
}
和ViewHolder
public class CartHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public ImageView shibaImg;
public TextView txtTen,txtMota,txtGia,txtThoigian;
ItemClickListener listener;
public CartHolder(@NonNull View itemView) {
super(itemView);
shibaImg = (ImageView) itemView.findViewById(R.id.cart_item_img);
txtTen = (TextView) itemView.findViewById(R.id.cart_item_ten);
txtMota = (TextView) itemView.findViewById(R.id.cart_item_mota);
txtGia = (TextView) itemView.findViewById(R.id.cart_item_gia);
txtThoigian = (TextView) itemView.findViewById(R.id.cart_item_history);
}
public void setItemClickListener(ItemClickListener listener){
this.listener = listener;
}
@Override
public void onClick(View v) {
listener.onClick(v, getAdapterPosition(),false);
}
}
这段代码似乎是问题所在:
cartList.orderByChild("userID").equalTo(userID)
此代码获取直接位于 cartList
下的每个子节点,并在它们的 userID
属性 上对它们进行排序。但是您的屏幕截图中没有 userID
属性,因此结果为空列表。
我最好的猜测是 cartList
下每个节点的 key 是用户 ID,在这种情况下,您可以改用:
cartList.child(userID)
所以:
final DatabaseReference cartList = FirebaseDatabase.getInstance().getReference().child("Cart");
FirebaseRecyclerOptions<Cart> options =
new FirebaseRecyclerOptions.Builder<Cart>()
.setQuery(cartList.child(userID),Cart.class).build();
我终于想通了。
出于某种原因,我的 CartActivity
上的 RecyclerView
需要时间来加载数据(可能是因为我在 HomeActivity
上有 3 个 RecyclerView
,有时数据显示,有时不显示,通常是 1 或 2 / 3 RecyclerViews 显示数据)。当我重新加载时(按返回并再次启动 Activity),RecyclerView 将出现并显示数据。
我的数据库是这样的
我正在尝试从购物车中的那个用户 ID 获取所有这些数据。但是我的 RecyclerView
什么也没显示。查了一下,adapter.getItemCount()
returns 0。我哪里错了?这是我的代码:
onStart()
private void loadData(){
auth = FirebaseAuth.getInstance().getCurrentUser();
userID = auth.getUid();
final DatabaseReference cartList = FirebaseDatabase.getInstance().getReference().child("Cart");
FirebaseRecyclerOptions<Cart> options =
new FirebaseRecyclerOptions.Builder<Cart>()
.setQuery(cartList.child(userID),Cart.class).build();
FirebaseRecyclerAdapter<Cart,CartHolder> adapter
= new FirebaseRecyclerAdapter<Cart, CartHolder>(options) {
@Override
protected void onBindViewHolder(@NonNull CartHolder holder, int position, @NonNull Cart model) {
holder.txtGia.setText(model.getTotal());
}
@NonNull
@Override
public CartHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.cart_item,parent,false);
CartHolder holder = new CartHolder(view);
return holder;
}
};
recyclerView.setAdapter(adapter);
adapter.startListening();
}
型号
public class Cart {
public String pID,num,time,addr,total,userID;
public Cart(){}
public Cart(String num,String pID,String time,String addr,String total,String userID) {
this.num = num;
this.pID = pID;
this.time = time;
this.addr = addr;
this.total = total;
this.userID = userID;
}
public String getNum() {
return num;
}
public String getpID() {
return pID;
}
public String getTime() {
return time;
}
public String getAddr() {
return addr;
}
public String getTotal() {
return total;
}
public String getUserID() {
return userID;
}
}
和ViewHolder
public class CartHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public ImageView shibaImg;
public TextView txtTen,txtMota,txtGia,txtThoigian;
ItemClickListener listener;
public CartHolder(@NonNull View itemView) {
super(itemView);
shibaImg = (ImageView) itemView.findViewById(R.id.cart_item_img);
txtTen = (TextView) itemView.findViewById(R.id.cart_item_ten);
txtMota = (TextView) itemView.findViewById(R.id.cart_item_mota);
txtGia = (TextView) itemView.findViewById(R.id.cart_item_gia);
txtThoigian = (TextView) itemView.findViewById(R.id.cart_item_history);
}
public void setItemClickListener(ItemClickListener listener){
this.listener = listener;
}
@Override
public void onClick(View v) {
listener.onClick(v, getAdapterPosition(),false);
}
}
这段代码似乎是问题所在:
cartList.orderByChild("userID").equalTo(userID)
此代码获取直接位于 cartList
下的每个子节点,并在它们的 userID
属性 上对它们进行排序。但是您的屏幕截图中没有 userID
属性,因此结果为空列表。
我最好的猜测是 cartList
下每个节点的 key 是用户 ID,在这种情况下,您可以改用:
cartList.child(userID)
所以:
final DatabaseReference cartList = FirebaseDatabase.getInstance().getReference().child("Cart");
FirebaseRecyclerOptions<Cart> options =
new FirebaseRecyclerOptions.Builder<Cart>()
.setQuery(cartList.child(userID),Cart.class).build();
我终于想通了。
出于某种原因,我的 CartActivity
上的 RecyclerView
需要时间来加载数据(可能是因为我在 HomeActivity
上有 3 个 RecyclerView
,有时数据显示,有时不显示,通常是 1 或 2 / 3 RecyclerViews 显示数据)。当我重新加载时(按返回并再次启动 Activity),RecyclerView 将出现并显示数据。