RecyclerView / Firebase-尝试检索具有我从另一个集合获取的特定ID的文档

时间:2018-06-12 10:30:11

标签: android firebase android-recyclerview google-cloud-firestore

我是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小时相媲美。

提前致谢

0 个答案:

没有答案