RecyclerView / Firebase - Попытка получить документ с определенным идентификатором, который я получаю из другой коллекции - PullRequest
0 голосов
/ 12 июня 2018

Я новичок в коде Java / Android.

Я использую облачную базу данных Firebase. Я пытаюсь создать «список избранных» в RecyclerView для каждого пользователя. Для этогоЯ пытаюсь извлечь данные из определенной коллекции. Для извлечения данных я использую определенный идентификатор, который я нахожу в своей подгруппе пользователей «Избранное», где вы можете найти документ с полем «id». Когда у меня есть«id» из «sub-collection». Я хочу посмотреть, есть ли на этот раз какой-либо документ в другой коллекции («etablissements») с тем же идентификатором. И если поле «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);
    }
}

}

В массиве элементов мне удаетсяполучить нужные мне данные из правильной коллекции (etablissements) и нужного документа, но есть две проблемы. Во-первых, похоже, мой

NewApplication.firestore().collection("users").document(uid).collection("favorites")

вызван слишком поздно. Он вызывается после всего. ИВторая проблема: Я не могу получить «items» (arraylist) с «новыми» данными, которые я просто добавляю / устанавливаю, после того, как второе «NewApplication ......» items равно [].

А поскольку мои элементы (arraylist) пусты, getItemCount возвращает 0, а затем мой onBindViewHolder даже не вызывается.

Есть ли способ исправить это?Если да, пожалуйста, помогите мне, я борюсь с этим как + 10 часов.

Заранее спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...