Я новичок в коде 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 часов.
Заранее спасибо