Адаптер FireBase Recycler не извлекает данные из FireBase

#java #android #firebase-realtime-database #firebaseui

#java #Android #firebase-realtime-database #firebaseui

Вопрос:

Моя база данных выглядит следующим образом введите описание изображения здесь

Я пытаюсь извлечь все эти данные из этого идентификатора ПОЛЬЗОВАТЕЛЯ внутри корзины. Но мой RecyclerView ничего не показывает. После проверки adapter.getItemCount() возвращает 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);
    }
}
 

Комментарии:

1. Мой запрос неверен?

2. эй, вы включили правила proguard?

3. Да, я это сделал! Так странно, что я использую это для другой таблицы в Firebase, и это работает, но не для этой.

4. эй, а вы добавили это в свои правила proguard: -keep class your.app.package.model.**{*;}

5. У меня было и до сих пор не работает.

Ответ №1:

Похоже, проблема в этом коде:

 cartList.orderByChild("userID").equalTo(userID)
 

Этот код берет все дочерние узлы непосредственно под cartList и упорядочивает их по их userID свойству. Но userID на вашем скриншоте нет свойства, поэтому в результате получается пустой список.

Я полагаю, что ключом каждого узла cartList является идентификатор пользователя, и в этом случае вы можете вместо этого использовать:

 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();
 

Комментарии:

1. Я пытался, но у меня RecyclerView все еще ничего нет, adapter размер равен 0, сэр.

2. Это неожиданно. Можете ли вы отредактировать свой вопрос, чтобы показать обновленный код?

3. Я попытался добавить userID в таблицу и orderByChild(userID) забыл обновить. Извините, сэр

Ответ №2:

Я наконец понял это. По какой RecyclerView CartActivity -то причине мне нужно время для загрузки данных (возможно, потому, что у меня включено 3 RecyclerView HomeActivity , и иногда отображаются данные, а иногда и нет, обычно 1 или 2/3 RecyclerViews показывают данные). Когда я перезагружаюсь (нажимаю назад и снова запускаю действие), появится RecyclerView и отобразит данные.