-1

I am trying to fetch data from the firebase to put on the view. My problem is how to get the data before the view is loaded. The array "mServicesNameSet" only has elements after the view has been loaded.

I tried to set the adapter on "OnStart" and using Thread.sleep() but didn't work.

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);
        }
    }
Rafael
  • 601
  • 7
  • 10

1 Answers1

0

Short answer, you can't. It can take awhile for firebase to return data (hundreds to thousands of milliseconds), and if you force the view to wait until that happens you app will hang. It has to be able to show something while it waits for firebase.

One solution would be to hide the main views in your activity and show a progress bar, then when the firebase call returns have it hide the progress bar, and update and show the views then with the data it retrieved.

Tyler V
  • 9,694
  • 3
  • 26
  • 52