加载视图之前如何从Firebase获取数据?

时间:2018-12-18 22:05:05

标签: android firebase firebase-realtime-database

我正在尝试从Firebase提取数据以放入视图。我的问题是在加载视图之前如何获取数据。 加载视图后,数组“ mServicesNameSet”仅具有元素。

我尝试将适配器设置为“ OnStart”,并使用Thread.sleep(),但没有用。

public class NewSubCategoriesActivity extends AppCompatActivity {

        private static final String TAG = "NewSubCategoriesActivity";
        private ViewPager mViewPager;
        private ArrayList<String> mServicesNameSet;
        private int[] mImagesSet = {
                R.drawable.homa_gardening,
                R.drawable.paint
        };
        NewSubCategoriesAdapter mCardAdapter;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_new_sub_categories);

            mServicesNameSet = new ArrayList<>();
            Bundle b = this.getIntent().getExtras();

            String category = null;
            if (b != null) {
                category = b.getString("category");
            }

            DatabaseReference mDatabaseReference = FirebaseDatabase.getInstance().getReference();

            mViewPager = findViewById(R.id.viewPagerSubCategories);
            mCardAdapter = new NewSubCategoriesAdapter(NewSubCategoriesActivity.this);

            mDatabaseReference.child("categories").child(category).addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    Log.e("Count ", "" + dataSnapshot.getChildrenCount());
                    for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
                        Service service = postSnapshot.getValue(Service.class);

                        if (service != null) {
                            if (!mServicesNameSet.contains(service.getSubCategory())) {
                                mServicesNameSet.add(service.getSubCategory());
                            }
                        }
                    }
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {
                    Log.w(TAG, "getServices:onCancelled", databaseError.toException());
                }
            });
        }

        @Override
        protected void onStart() {
            super.onStart();

            for (int i = 0; i < mServicesNameSet.size(); i++) {
                mCardAdapter.addCardItemS(new CardItemString(mServicesNameSet.get(i), mImagesSet[i]));
            }

            ShadowTransformer mCardShadowTransformer = new ShadowTransformer(mViewPager, mCardAdapter);
            mViewPager.setAdapter(mCardAdapter);
            mViewPager.setPageTransformer(false, mCardShadowTransformer);
            mViewPager.setOffscreenPageLimit(3);
        }
    }

1 个答案:

答案 0 :(得分:0)

简短的回答,不能。 Firebase可能需要一段时间才能返回数据(几百到几千毫秒),如果您强制视图等待到这种情况发生,则应用将挂起。它必须能够在等待Firebase时显示某物

一种解决方案是隐藏活动中的主视图并显示进度条,然后在firebase调用返回时将其隐藏进度条,然后更新并显示视图,然后再将其检索到的数据显示出来。