我是Java / Android代码的初学者。
我正在使用Firebase云数据库。 我正在尝试为每个用户在RecyclerView中做一个“收藏列表”。为此,我正在尝试从某个集合中检索数据。要检索数据,我使用我在用户子集“收藏夹”中找到的某个ID,您可以在其中找到带有“id”字段的文档。 当我从“子集合”获得“id”时,我想看看这次是否有另一个集合中的任何文档(“etablissements”),具有相同的id。如果“id”字段匹配,我会尝试从此特定文档中检索数据并将其“注入”RecyclerView。
我正在努力使用适配器(FavoriteAdapter)。
public class FavoriteAdapter extends RecyclerView.Adapter<FavoriteAdapter.ViewHolder> {
private final Context context;
private final List<FavoriteItem> items = Lists.newArrayList();
private String idInFav;
String name;
public FavoriteAdapter(Context context) {
this.context = context;
String uid = FirebaseAuth.getInstance().getUid();
NewApplication.firestore().collection("users").document(uid).collection("favorites").addSnapshotListener((snapshots, e) -> {
if (e != null) {
Log.w(TAG, "Listen failed.", e);
return;
}
for (DocumentChange dc : snapshots.getDocumentChanges()) {
switch (dc.getType()) {
case ADDED:
idInFav = dc.getDocument().getString("id");
NewApplication.firestore().collection("etablissements").whereEqualTo("id", idInFav).addSnapshotListener((snapshots1, e1) -> {
if (e1 != null) {
Log.w(TAG, "Listen failed.", e1);
return;
}
for (DocumentSnapshot ds : snapshots1) {
items.add(dc.getNewIndex(), ds.toObject(FavoriteItem.class));
}
});
break;
case MODIFIED:
idInFav = dc.getDocument().getString("id");
NewApplication.firestore().collection("etablissements").whereEqualTo("id", idInFav).addSnapshotListener((snapshots1, e1) -> {
if (e1 != null) {
Log.w(TAG, "Listen failed.", e1);
return;
}
for (DocumentSnapshot ds : snapshots1) {
name = ds.getString("nom");
items.set(dc.getNewIndex(), ds.toObject(FavoriteItem.class));
}
});
break;
case REMOVED:
items.remove(dc.getOldIndex());
break;
}
FavoriteAdapter.this.notifyDataSetChanged();
}
});
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
return new ViewHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.fav_item, viewGroup, false));
}
@Override
public void onBindViewHolder(@NonNull final ViewHolder viewHolder, int i) {
FavoriteItem user = items.get(i);
SimpleDateFormat mdformat = new SimpleDateFormat("dd / MM / yyyy");
String date = mdformat.format(user.timestamp);
viewHolder.textViewHeadInFav.setText(user.nom);
viewHolder.textViewDescInFav.setText(user.description);
viewHolder.dateSinceWhenFav.setText(date);
}
@Override
public int getItemCount() {
return items.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder {
@BindView(R.id.textViewHeadInFav)
protected TextView textViewHeadInFav;
@BindView(R.id.textViewDescInFav)
protected TextView textViewDescInFav;
@BindView(R.id.imageViewInFav)
protected ImageView imageViewInFav;
@BindView(R.id.dateSinceWhenFav)
protected TextView dateSinceWhenFav;
public ViewHolder(@NonNull View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
}
}
在项目arraylist中,我设法从正确的集合(etablissements)和正确的文档中获取我想要的数据但是有两个问题。首先,它看起来像我的
NewApplication.firestore().collection("users").document(uid).collection("favorites")
被称为太晚了。它被称为一切。 第二个问题是:在第二个“NewApplication ......”项等于[]之后,我无法获得“新”数据的“项目”(arraylist),我只是添加/设置了它。
因为我的项目(arraylist)是空的,getItemCount返回0然后我的onBindViewHolder甚至没有被调用。
有什么办法可以解决吗?如果是的话,请帮助我,我正在努力与+ 10小时相媲美。
提前致谢