Android生命周期 - 我在哪里检查查询是否没有返回任何项目?

时间:2017-07-19 15:50:27

标签: android android-fragments firebase firebase-realtime-database

编辑:我删除了不相关的代码。

我正在Android studio中编写应用程序,并将其连接到Firebase以进行身份​​验证和数据库。我一直在关注他们的例子,这导致我第一次使用片段。我不完全确定我在做什么。

我想要的是:当用户经过身份验证并被定向到MainActivity(主要是他们的主屏幕)时,将检索并显示他们创建的项目列表(称为图表)。 (将来还会有一个他们喜欢的库项目列表,但是还没有实现。但是,我已经设置了一个寻呼机/标签系统,以便我可以在以后插入它。)这是有效的好的,使用Recycler View显示所有检索到的项目。但是,如果用户没有项目,我想显示一条特殊的消息,以及一个按钮来创建他们的第一个项目。我只是不确定我在活动/片段生活方式的哪个阶段,以及如何做到这一点。

我认为相关代码如下(如果需要,我可以发布更多内容,但我认为就是这样):

在MainActivity中,在OnCreate中(用户正在创建图表):

mPagerAdapter = new FragmentPagerAdapter(getSupportFragmentManager()) {
    private final Fragment[] mFragments = new Fragment[] {
            new MyChartsFragment()
    };
    private final String[] mFragmentNames = new String[] {
            getString(R.string.heading_my_charts)
    };
};

这样就显示了标签(“我的图表”)和相应的列表。

MyChartsFragment是ChartListFragment的扩展,只是一个特定的查询。 ChartListFragment包含:

@Override
public View onCreateView (LayoutInflater inflater, ViewGroup container,
                          Bundle savedInstanceState) {
    super.onCreateView(inflater, container, savedInstanceState);
    View rootView = inflater.inflate(R.layout.fragment_all_charts, container, false);

    mDatabase = FirebaseDatabase.getInstance().getReference();

    mRecycler = (RecyclerView) rootView.findViewById(R.id.charts_list);
    mRecycler.setHasFixedSize(true);

    mEmptyListView = mRootView.findViewById(R.id.empty_chart_list);

    return rootView;
}

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

    // Set up Layout Manager, reverse layout
    mManager = new LinearLayoutManager(getActivity());
    mManager.setReverseLayout(true);
    mManager.setStackFromEnd(true);
    mRecycler.setLayoutManager(mManager);

    // Set up FirebaseRecyclerAdapter with the Query
    Query chartsQuery = getQuery(mDatabase);
    mAdapter = new FirebaseRecyclerAdapter<Chart, ChartViewHolder>(Chart.class, R.layout.item_chart,
            ChartViewHolder.class, chartsQuery) {
        @Override
        protected void populateViewHolder(final ChartViewHolder viewHolder, final Chart model, final int position) {
            final DatabaseReference chartRef = getRef(position);

            // If list is empty, show the message instead
            // Currently this doesn't work - nothing appears
            mEmptyListView.setVisibility(mAdapter.getItemCount() == 0 ? View.VISIBLE : View.INVISIBLE);
        }

        // Show message if the list is empty
        // Currently not working
        @Override
        protected void onDataChanged() {
            mEmptyListView.setVisibility(mAdapter.getItemCount() == 0 ? View.VISIBLE : View.INVISIBLE);
        }
    };
    mRecycler.setAdapter(mAdapter);
}

这使用以下布局:

fragment_all_charts:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/charts_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clipToPadding="false"
        android:padding="5dp"
        android:scrollbars="vertical"
        tools:listitem="@layout/item_chart" />

<android.support.constraint.ConstraintLayout
    android:id="@+id/empty_chart_list"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Testing"/>
</android.support.constraint.ConstraintLayout>

</FrameLayout>

所以,如果图表存在,这一切都很好,但如果不存在,那么我希望将整个“我的图表”页面替换为一条消息,上面写着“通过创建第一张图表开始使用”,按钮或点击的东西。我的问题是,如何让它测试图表的数量,如果是0,用另一个布局替换MyChartsFragment和消息和按钮?

2 个答案:

答案 0 :(得分:2)

从FirebaseUI 1.1开始,您可以覆盖的适配器中有一个onDataChanged()方法,然后按照Shark的评论检查项目计数。

来自samples app of FirebaseUI

    @Override
    protected void onDataChanged() {
        // if there are no chat messages, show a view that invites the user to add a message
        mEmptyListView.setVisibility(mRecyclerViewAdapter.getItemCount() == 0 ? View.VISIBLE : View.INVISIBLE);
    }

答案 1 :(得分:1)

我不知道如何从firebase获取数据,但我认为它的工作方式类似于从contentprovider获取数据:

  • 您定义了一个查询
  • 将查询添加到适配器
  • 将适配器附加到视图
  • 视图调用registerContentObserver以在数据更改或提取数据完成时获取通知。

如果您的应用想要通知Android媒体数据库中的图像已更改,您可以使用

activity.getContentResolver().registerContentObserver(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, true, new ContentObserver(null) {
    @Override
    public void onChange(boolean selfChange) {
        // something in MediaStore.Images.Media.EXTERNAL_CONTENT_URI has changed
    }
});

如果您的应用想要通知所有已注册的ContentObserver-s,则会调用

mAdapter.notifyDataSetChanged();