Как получить данные из firebase перед загрузкой представления? - PullRequest
0 голосов
/ 19 декабря 2018

Я пытаюсь получить данные из базы данных для отображения в представлении.Моя проблема заключается в том, как получить данные до загрузки представления.Массив «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 голосов
/ 19 декабря 2018

Короткий ответ, вы не можете.Firebase может занять некоторое время, чтобы вернуть данные (от сотен до тысяч миллисекунд), и если вы заставите представление ждать, пока это произойдет, ваше приложение будет зависать.Он должен иметь возможность показывать что-то , пока он ожидает firebase.

Одним из решений было бы скрыть основные виды в вашей деятельности и показать индикатор выполнения, затем, когда вызов firebase вернетсяпусть он скрывает индикатор выполнения, а затем обновляет и отображает представления с полученными данными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...