Я использую FirestoreRecyclerAdapter
, чтобы показать элементы в RecyclerView
. Когда я вызываю adapter.startListening();
в моей активности onStart()
, адаптер пуст во время выполнения. Я решил зарегистрировать прослушиватель на тот же запрос, что и для адаптера, и передать список Objects
на onBindViewHolder
адаптера, и он отлично работает. вот мой адаптер
private void loadList(Query query) {
recycler.setHasFixedSize(true);
LinearLayoutManager manager = new LinearLayoutManager(this);
recycler.setLayoutManager(manager);
FirestoreRecyclerOptions<Post response = new FirestoreRecyclerOptions.Builder<Post()
.setQuery(query, Post.class)
.build();
adapter = new FirestoreRecyclerAdapter<Post, PostViewHolder(response) {
@Override
protected void onBindViewHolder(PostViewHolder holder, int position, Post model) {
//holder.setData(postList.get(position));
holder.setData(model);
}
@Override
public PostViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.post_layout, parent, false);
return new PostViewHolder(view);
}
@Override
public void onError(FirebaseFirestoreException e) {
Log.e("error", e.getMessage());
}
};
adapter.notifyDataSetChanged();
recycler.setAdapter(adapter);
}
Мой адаптер всегда пуст без этого зарегистрированного слушателя:
firestoreListener = query
.addSnapshotListener(new EventListener<QuerySnapshot() {
@Override
public void onEvent(QuerySnapshot documentSnapshots, FirebaseFirestoreException e) {
if (e != null) {
//Log.e(TAG, "Listen failed!", e);
return;
}
postList = new ArrayList<();
for (DocumentSnapshot doc : documentSnapshots) {
Post post = doc.toObject(Post.class);
postList.add(post);
}
adapter.notifyDataSetChanged();
recycler.setAdapter(adapter);
}
});
Это как обычно должно быть сделано? Я думал, что запрос, переданный адаптеру в FirestoreRecyclerOptions
, был достаточным, и адаптер собирался начать слушать, когда я позвоню adapter.startListening();