Я извлекаю данные с помощью FirestoreRecyclerAdapter, и по завершении мне нужно проверить, были ли извлечены какие-либо элементы. Я не могу понять, как это сделать.
Я вызываю его из класса FragmentChartsList, показанного ниже. Это должно изначально настроить адаптер с «именем» в качестве значения для mOrder. Позже действие, содержащее этот фрагмент, может вызвать setOrderField() с другим значением mOrder, которое пользователь выбрал из Spinner.
Каждый раз, когда вызывается setOrderField(), создается новый экземпляр адаптера, который присоединяется к recyclerView. На этом этапе мне нужно проверить, содержит ли новая версия адаптера какие-либо данные, и либо показать сообщение «диаграммы не найдены», либо показать диаграммы, которые были извлечены (очевидно, если список просто сортируется, тогда количество элементы остаются прежними, но я собираюсь расширить это, чтобы пользователь мог фильтровать диаграммы по разным критериям, поэтому количество возвращаемых диаграмм изменится).
В настоящее время setOrderField() вызывает refreshViewOnNewData(), который должен выяснить, сколько диаграмм отображается; если он равен 0, он должен отображать сообщение «диаграммы не найдены», а если он > 0, он должен отображать RecyclerView, содержащий диаграммы.
На данный момент я всегда получаю значение 0, когда пытаюсь подсчитать диаграммы. Я подозреваю, что это потому, что адаптер еще не закончил извлекать их из базы данных, но я не могу найти ничего, что позволило бы мне добавить какой-нибудь слушатель "onComplete", чтобы я знал, что это завершено.
Может ли кто-нибудь предложить, как я могу этого добиться?
public abstract class FragmentChartsList extends Fragment {
private FirebaseFirestore mDatabaseRef;
private ChartListAdapter mAdapter;
private Query mChartsQuery;
private RecyclerView mRecycler;
private String mOrder = "name";
private TextView mLoadingList, mEmptyList;
public FragmentChartsList() {}
@Override
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
View rootView = inflater.inflate(
R.layout.fragment_charts_list, container, false);
mRecycler = rootView.findViewById(R.id.charts_list);
mRecycler.setHasFixedSize(true);
mLoadingList = rootView.findViewById(R.id.loading_list);
mEmptyList = rootView.findViewById(R.id.empty_list);
// Set up Layout Manager, and set Recycler View to use it
LinearLayoutManager mManager = new LinearLayoutManager(getActivity());
mManager.setReverseLayout(true);
mManager.setStackFromEnd(true);
mRecycler.setLayoutManager(mManager);
// Connect to the database
mDatabaseRef = FirebaseFirestore.getInstance();
setOrderField(mOrder); // Initialised to "name"
return rootView;
}
@Override
public void onStart() {
super.onStart();
mAdapter.startListening();
}
@Override
public void onStop() {
super.onStop();
mAdapter.stopListening();
}
@Override
public void onDestroy() {
super.onDestroy();
mAdapter.stopListening();
}
// HELPER FUNCTIONS
public void setOrderField(String order) {
mOrder = order;
mChartsQuery = getQuery(mDatabaseRef, mOrder);
// Update recycler options
FirestoreRecyclerOptions<Chart> recyclerOptions = new FirestoreRecyclerOptions.Builder<Chart>()
.setQuery(mChartsQuery, Chart.class)
.build();
mAdapter = new ChartListAdapter(recyclerOptions, getActivity());
mAdapter.startListening();
mRecycler.swapAdapter(mAdapter, true);
refreshViewOnNewData();
}
private void refreshViewOnNewData() {
// Hide "loading" text
mLoadingList.setVisibility(View.GONE);
// Check number of charts being shown
//if (mAdapter != null && (mAdapter.getCount() > 0)) {
// If > 0, show Charts
mEmptyList.setVisibility(View.GONE);
mRecycler.setVisibility(View.VISIBLE);
} else {
// If number of Charts = 0
// show "no charts"
mEmptyList.setVisibility(View.VISIBLE);
mRecycler.setVisibility(View.GONE);
}
}
}
Класс адаптера выглядит так:
public class ChartListAdapter extends FirestoreRecyclerAdapter<Chart, ChartViewHolder> {
private Activity mActivity;
private int mCount;
public ChartListAdapter(FirestoreRecyclerOptions<Chart> recyclerOptions, Activity activity) {
super(recyclerOptions);
mActivity = activity;
}
@Override
protected void onBindViewHolder(@NonNull ChartViewHolder holder, int position, @NonNull Chart model) {
final String chartKey = this.getSnapshots().getSnapshot(position).getId();
model.setKey(chartKey);
// Set click listener for the chart
// On click, the user can view the chart
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(mActivity, ActivityViewChart.class);
intent.putExtra("ChartKey", chartKey);
mActivity.startActivity(intent);
}
});
// Implement long-click menu
mActivity.registerForContextMenu(holder.itemView);
// Bind Chart to ViewHolder
holder.bindToChart(model);
}
@NonNull
@Override
public ChartViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_chart, parent, false);
return new ChartViewHolder(view);
}
@Override
public void onDataChanged() {
super.onDataChanged();
mCount = getItemCount();
}
public int getCount() {
return mCount;
}
}
Выяснил это... Вместо этого мне нужно было установить прослушиватель запроса.
Итак, вместо вызова refreshViewOnNewData из setOrder выше у меня теперь есть:
mChartsQuery.addSnapshotListener(new EventListener<QuerySnapshot>() {
@Override
public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots, @Nullable FirebaseFirestoreException e) {
if (queryDocumentSnapshots != null) {
mLoadingList.setVisibility(View.GONE);
if (queryDocumentSnapshots.size() > 0) {
mEmptyList.setVisibility(View.GONE);
mRecycler.setVisibility(View.VISIBLE);
}else {
mEmptyList.setVisibility(View.VISIBLE);
mRecycler.setVisibility(View.GONE);
}
}
}
});
}
Также удален mCount из класса адаптера вместе с getCount и onDataChanged.