首页 > 解决方案 > Android Studio ArrayList 未填充到 onCompleteListener

问题描述

我有一个产品的 ArrayList,必须填充一些数据,如数量、名称、到期时间和 id。

我使用了两个 firebase 查询,因为我需要从用户的收藏愿望清单中获取“愿望清单”productid,然后从每个愿望清单产品的集合“annuncio”中检索产品数据。

代码似乎有效,当我尝试填充“prod”ArrayList 时,我看到数据是从调试器进来的,但是一旦我在 for 之后检查 prod,它看起来数组列表是空的。

这是片段的代码:

public class FavouriteAdvertisement extends Fragment {
    public static final String ARG_OBJECT = "object2";
    public RecyclerView recyclerView ;
    private ArrayList<Product> products;


    // creates the view and calls the function favouriteProductsToRecycleview to load the cards
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        View root = inflater.inflate(R.layout.fragment_favourite, container, false);
        products  = new ArrayList<Product>();
       favouriteProductsToRecycleview(root,products);
        return root;
    }

    @SuppressLint("SetTextI18n")
    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {

    }

    private void favouriteProductsToRecycleview(View v, ArrayList<Product>prod) {

        FirebaseFirestore db;
        FirebaseAuth auth;
        auth = FirebaseAuth.getInstance();
        db = FirebaseFirestore.getInstance();

        //first query that gets every favourite item of the user

        Task<QuerySnapshot> documenti = db.collection("watchlist")
                .whereEqualTo("User", auth.getUid())
                .get()
                .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<QuerySnapshot> task) {
                        if (task.isSuccessful()) {
                            for (QueryDocumentSnapshot document : task.getResult()) {

                                //second query that uses the favourite items to retrieve their data

                                FirebaseFirestore db2 = FirebaseFirestore.getInstance();
                                DocumentReference doc = db2.collection("annuncio")
                                        .document(Objects.requireNonNull(document.getString("Product")));
                                doc.get()
                                        .addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
                                            @Override
                                            public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                                                DocumentSnapshot doc2;
                                                if (task.getResult().exists()) {
                                                    doc2 = task.getResult();
                                                } else {
                                                    return;
                                                }
                                                doc2 = task.getResult();
                                                prod.add(new Product(doc2.getString("name"),
                                                        doc2.getString("quantity"),
                                                        doc2.getString("expiration"),
                                                        doc2.getString("UId"),
                                                        doc2.getId()));
                                            }
                                            //until here prod fills correctly , but when it goes to the recycle view it's empty??? TODO
                                        });
                            }

                                recyclerView = v.findViewById(R.id.result_favourite);
                                MyAdapter myAdapter = new MyAdapter(v.getContext(), prod);
                                recyclerView.setAdapter(myAdapter);
                                recyclerView.setLayoutManager(new LinearLayoutManager(v.getContext()));
                        }
                    }
                });

    }
}

这是我的适配器:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>  {
    private ArrayList< Product> products;
    Context context;

    public MyAdapter(Context ct , ArrayList<Product> prodotti){

        products=prodotti;
        context=ct;


    }

        // here i create my card
    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater inflater =LayoutInflater.from(context);
        View view =inflater.inflate(R.layout.home_card,parent,false);
        return  new MyViewHolder(view);
    }

    // here i add information to my card
    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
      holder.name.setText(products.get(position).getName());
      holder.quantity.setText(products.get(position).getQuantity());
      holder.expire.setText(products.get(position).getExpiration());
      holder.userid.setText(products.get(position).getUserId());
      holder.productId =products.get(position).getProduct();

    }

    @Override
    public int getItemCount() {
        return products.size();
    }


// here i declare what are the attributes of the card and how it behaves
    public static class MyViewHolder extends RecyclerView.ViewHolder{
        TextView name,quantity,expire,userid;
        Button  goToUser;
        FloatingActionButton addToFavorite;
        String productId;
       public MyViewHolder(@NonNull View itemView) {
           super(itemView);
           expire = itemView.findViewById(R.id.productexpire);
           name = itemView.findViewById(R.id.productname);
           quantity =  itemView.findViewById(R.id.productquantity);
           userid = itemView.findViewById(R.id.productauthor);

           addToFavorite = itemView.findViewById(R.id.add_to_fav_btn);
           addToFavorite.setOnClickListener(new View.OnClickListener() {

               @Override
               public void onClick(View view) {
                   FirebaseFirestore db = FirebaseFirestore.getInstance();
                   Date date = new Date();
                   SimpleDateFormat ft =
                           new SimpleDateFormat ("E yyyy.MM.dd 'at' hh:mm:ss a zzz");

                   Map<String, Object> prod = new HashMap<>();
                   prod.put("User",userid.getText());
                   prod.put("Product",productId);
                   prod.put("date",ft.format(date));

                   db.collection("watchlist")
                           .document()
                           .set(prod, SetOptions.merge())
                           .addOnSuccessListener(new OnSuccessListener<Void>() {
                               @Override
                               public void onSuccess(Void aVoid) {
                                   Toast.makeText(view.getContext(),"added to favourites",Toast.LENGTH_SHORT).show();

                               }
                           })
                   .addOnFailureListener(new OnFailureListener() {
                       @Override
                       public void onFailure(@NonNull Exception e) {
                           Toast.makeText(view.getContext(),"cannot add to favourites",Toast.LENGTH_SHORT).show();
                       }
                   });

               }
           });

           goToUser =itemView.findViewById(R.id.btngotouser);
           goToUser.setOnClickListener(new View.OnClickListener() {
               @Override
               public void onClick(View view) {
                   Toast.makeText(view.getContext(),"bla",Toast.LENGTH_SHORT).show();
                   UserFragment userFragment = new UserFragment();
                   FragmentManager fragmentManager = new FragmentManager(){} ;
                   fragmentManager.beginTransaction().replace(R.id.list_home,userFragment);
               }
           });



       }
   }

}

和我的产品对象

public class Product {
    private String Name;
    private String Quantity;
    private String Expiration;
    private String UserId;
    private String product;


    public Product(String name, String quantity, String expiration,String Uid, String productId) {
        Name = name;
        Quantity = quantity;
        Expiration = expiration;
        UserId = Uid;
        product = productId;
    }

    public String getProduct() {
        return product;
    }

    public void setProduct(String product) {
        this.product = product;
    }

    public String getUserId() {
        return UserId;
    }

    public void setUserId(String userId) {
        UserId = userId;
    }

    public String getQuantity() {
        return Quantity;
    }

    public String getExpiration() {
        return Expiration;
    }

    public String getName() {
        return Name;
    }

    public void setName(String name) {
        Name = name;
    }

    public void setQuantity(String quantity) {
        Quantity = quantity;
    }

    public void setExpiration(String expiration) {
        Expiration = expiration;

    }
}

标签: javaandroidarrays

解决方案


你的 onclicklistener 需要写在 onbindviewholder 中。那是你的回收器视图被加载的地方。视图持有者只是一个类来保存回收器视图的视图。

       addToFavorite.setOnClickListener(new View.OnClickListener() {

           @Override
           public void onClick(View view) {
               FirebaseFirestore db = FirebaseFirestore.getInstance();
               Date date = new Date();
               SimpleDateFormat ft =
                       new SimpleDateFormat ("E yyyy.MM.dd 'at' hh:mm:ss a zzz");

               Map<String, Object> prod = new HashMap<>();
               prod.put("User",userid.getText());
               prod.put("Product",productId);
               prod.put("date",ft.format(date));

               db.collection("watchlist")
                       .document()
                       .set(prod, SetOptions.merge())
                       .addOnSuccessListener(new OnSuccessListener<Void>() {
                           @Override
                           public void onSuccess(Void aVoid) {
                               Toast.makeText(view.getContext(),"added to favourites",Toast.LENGTH_SHORT).show();

                           }
                       })
               .addOnFailureListener(new OnFailureListener() {
                   @Override
                   public void onFailure(@NonNull Exception e) {
                       Toast.makeText(view.getContext(),"cannot add to favourites",Toast.LENGTH_SHORT).show();
                   }
               });

           }
       });

推荐阅读