Не удается получить FirestoreRecyclerAdapter для отображения элементов

Я обновляю свое приложение, чтобы использовать базу данных Firebase Firestore. Я изо всех сил пытаюсь заставить приложение отображать данные, полученные из базы данных. Данные получены нормально, но не отображаются. Установив точки останова, я установил, что ViewHolder ни в какой момент не привязан к адаптеру.

Данные отображаются во фрагменте. Макет фрагмента (я убрал ненужные вещи, такие как отступы, размеры и т. д.):

<android.support.constraint.ConstraintLayout
    android:id = "@+id/layout_charts_list"
    tools:context = "apppath.fragments.ChartListFragment">

    <TextView
        android:id = "@+id/loading_list"
        android:text = "@string/loading_my_charts" />

    <TextView
        android:id = "@+id/empty_list"
        android:text = "@string/my_charts_empty"
        android:visibility = "gone"/>

    <android.support.v7.widget.RecyclerView
        android:id = "@+id/charts_list" />

</android.support.constraint.ConstraintLayout>

Сам код фрагмента:

public abstract class ChartListFragment extends Fragment {

    private FirebaseFirestore mDatabaseRef;
    private FirestoreRecyclerAdapter<Chart, ChartViewHolder> mAdapter;
    private Query mChartsQuery;
    private RecyclerView mRecycler;

    public ChartListFragment() {}

    @Override
    public View onCreateView(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);

        // 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, and get the appropriate query (as set in the actual fragment)
        mDatabaseRef = FirebaseFirestore.getInstance();
        mChartsQuery = getQuery(mDatabaseRef);

        // Set up Recycler Adapter
        FirestoreRecyclerOptions<Chart> recyclerOptions = new FirestoreRecyclerOptions.Builder<Chart>()
                .setQuery(mChartsQuery, Chart.class)
                .build();

        mAdapter = new ChartListAdapter(recyclerOptions);

        // Use Recycler Adapter in RecyclerView
        mRecycler.setAdapter(mAdapter);

        return rootView;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        // Add listener to charts collection, and deal with any changes by re-showing the list
        mChartsQuery.addSnapshotListener(new EventListener<QuerySnapshot>() {
            @Override
            public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots,
                                @Nullable FirebaseFirestoreException e) {

                if (queryDocumentSnapshots != null && queryDocumentSnapshots.isEmpty()) {
                    ((MainActivity) getActivity()).setPage(1);
                    mRecycler.setVisibility(View.GONE);
                }else {
                    mRecycler.setVisibility(View.VISIBLE);
                }

            }
        });
    }


    // HELPER FUNCTIONS

    public abstract Query getQuery(FirebaseFirestore databaseReference);

}

ChartListAdapter выглядит следующим образом:

public class ChartListAdapter
        extends FirestoreRecyclerAdapter<Chart, ChartViewHolder> {

    public ChartListAdapter(FirestoreRecyclerOptions recyclerOptions) {
        super(recyclerOptions);

    }

    @Override
    protected void onBindViewHolder(ChartViewHolder holder, int position, Chart model) {
        holder.setChartName(model.getName());

        // Bind Chart to ViewHolder
        holder.bindToChart(model);
    }

    @Override
    public ChartViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.item_chart, parent, false);

        return new ChartViewHolder(view);
    }
}

ChartViewHolder:

public class ChartViewHolder extends RecyclerView.ViewHolder {

    private TextView chartNameView;
    private String chartKey;

    public ChartViewHolder(View itemView) {
        super(itemView);

        chartNameView = itemView.findViewById(R.id.chart_name);
    }

    public void setChartName(String chartName) {
        chartNameView.setText(chartName);
    }

    public void bindToChart(Chart chart) {
        chartKey = chart.getKey();
        chartNameView.setText(chart.getName());
    }

    public String getChartKey() {
        return chartKey;
    }
}

Вызывается конструктор ChartListAdapter, но onBindViewHolder и onCreateViewHolder никогда не вызываются, а доступ к ChartViewHolder вообще не осуществляется. Мне не хватает строчки кода? Или это совершенно неправильно? Я не очень хорошо знаком с адаптерами и RecyclerViews, поэтому мне было довольно сложно разобраться в том, как собрать все это вместе.

2
0
2 195
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вам нужно добавить следующее, чтобы начать прослушивание данных, вызовите метод startListening(). Вы можете вызвать это в своем методе onStart(). Перед вызовом startListening() убедитесь, что вы выполнили любую аутентификацию, необходимую для чтения данных, иначе ваш запрос завершится ошибкой:

@Override
protected void onStart() {
super.onStart();
adapter.startListening();
}

подробнее здесь:

https://github.com/firebase/FirebaseUI-Android/tree/master/firestore

Для тех, кто пришел сюда из Google, установите владельца жизненного цикла в параметрах, чтобы запуск / остановка прослушивания вызывалась автоматически.

FirestoreRecyclerOptions<Chart> recyclerOptions = FirestoreRecyclerOptions.Builder<Chart>()
            .setQuery(mChartsQuery, Chart.class)
            .setLifecycleOwner(this)
            .build();

Другие вопросы по теме