无法获取FirestoreRecyclerAdapter来显示项目

时间:2018-05-01 15:51:55

标签: android firebase google-cloud-firestore recycler-adapter firebaseui

我正在更新我的应用以使用Firebase的Firestore数据库。我努力让应用程序显示从数据库中检索到的数据。数据检索正常,但不会显示。通过设置断点,我已经确定ViewHolder在任何时候都没有绑定到适配器。

数据显示在片段中。片段布局是(我已经取出了不相关的东西,如填充,大小等):

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);

}

片段代码本身是:

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);
    }
}

ChartListAdapter如下:

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;
    }
}

ChartViewHolder:

<input [ngClass]="{'borderRed':email.invalid}" class="form-control m-input" type="text" required="required" name="email" [(ngModel)]="model.email" #email="ngModel" autocomplete="off">

调用ChartListAdapter构造函数,但从不调用onBindViewHolder和onCreateViewHolder,并且根本不会访问ChartViewHolder。我错过了一行代码吗?或者这样做完全错了?我并不熟悉Adapters和RecyclerViews,所以我发现很难把它放在一起。

2 个答案:

答案 0 :(得分:2)

您需要添加以下内容,才能开始侦听数据,请调用startListening()方法。您可能希望在onStart()方法中调用此方法。在调用startListening()之前确保您已完成读取数据所需的任何身份验证,否则您的查询将失败:

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

更多信息:

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

答案 1 :(得分:0)

对于那些来自Google的用户,请在选项上设置生命周期所有者,以便自动调用开始/停止监听。

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