编辑:我删除了不相关的代码。
我正在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和消息和按钮?
答案 0 :(得分:2)
从FirebaseUI 1.1开始,您可以覆盖的适配器中有一个onDataChanged()
方法,然后按照Shark的评论检查项目计数。
@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获取数据:
如果您的应用想要通知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();