java - 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;
}
}
解决方案
你的 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();
}
});
}
});
推荐阅读
- angularjs - Angularjs:使用 ng-class 的性能
- powershell - 如何删除txt文件中所有前缀为913-的电话号码
- java - Spring Boot & Kafka - 尝试以错误格式使用消息时出现“错误反序列化键/值”循环
- logging - 如何配置 MFP 服务器日志级别?
- python - 如何在 Jupyter 中获取单个字符输入?
- angularjs - md-chips 中的 $index 不会在 AngularJS 中更新
- mysql - MySQL InnoDB 死锁
- c - wolfcryp RSA 解析密钥分段失败
- asp.net - 数据存储库中 Where 方法的模拟在存储库中的实际实现中返回 null
- c++ - Vscode/C++ - cout 无法输出完整的句子,也无法与整数连接