首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FirestoreRecyclerAdapter -如何知道何时检索到数据?

FirestoreRecyclerAdapter -如何知道何时检索到数据?
EN

Stack Overflow用户
提问于 2019-02-09 05:08:52
回答 1查看 235关注 0票数 0

我正在使用FirestoreRecyclerAdapter检索数据,并且在完成时,我需要检查是否检索到了任何项。我想不出该怎么做。

我从一个名为FragmentChartsList的类中调用它,如下所示。这应该会在最初设置适配器,并将"name“作为mOrder的值。稍后,包含此片段的活动可以使用不同的mOrder值调用setOrderField(),该值是用户从微调控制项中选择的。

每次调用setOrderField()时,都会创建一个新的适配器实例并将其附加到recyclerView。此时,我需要检查新版本的适配器是否包含任何数据,并显示"no Charts found“消息,或者显示检索到的图表(显然,如果只是对列表进行排序,则条目的数量保持不变,但我将对其进行扩展,以允许用户根据不同的条件过滤图表,因此返回的图表数量将发生变化)。

目前,setOrderField()调用refreshViewOnNewData(),它应该知道显示了多少个图表;如果它是0,它应该显示“没有找到图表”消息,如果它>0,它应该显示包含图表的RecyclerView。

目前,当我尝试计算图表时,我总是得到0的值。我怀疑这是因为适配器还没有完成从数据库中检索它们,但是我找不到任何允许我添加某种"onComplete“侦听器的东西,这样我就知道它已经完成了。

有没有人能建议我如何做到这一点?

代码语言:javascript
复制
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);
        }

    }

}

适配器类如下所示:

代码语言:javascript
复制
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;
    }

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-11 20:40:24

弄清楚了..。我需要在查询上设置一个监听器。

因此,我现在不是从上面的setOrder调用refreshViewOnNewData,而是:

代码语言:javascript
复制
    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,以及getCountonDataChanged

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54600239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档