Firebase 返回空数组的ViewPager

Firebase 返回空数组的ViewPager,firebase,arraylist,firebase-realtime-database,android-viewpager,android-pageradapter,Firebase,Arraylist,Firebase Realtime Database,Android Viewpager,Android Pageradapter,启动我的应用程序时,我希望我的customSwipeAdapter.java等待,直到我的savedImages ArrayList收到并填充了来自firebase的数据。但是我的类正在运行,而我的整个页面是空的,因为getCount()方法将savedImages.size()返回为0,因为我的arraylist没有及时填充。当我的数组列表被填充时,关于运行我的类的任何帮助。不确定在这里做什么:) customSwipeAdapter.java public class customS

启动我的应用程序时,我希望我的
customSwipeAdapter.java
等待,直到我的
savedImages ArrayList
收到并填充了来自firebase的数据。但是我的类正在运行,而我的整个页面是空的,因为
getCount()
方法将
savedImages.size()
返回为0,因为我的arraylist没有及时填充。当我的数组列表被填充时,关于运行我的类的任何帮助。不确定在这里做什么:)

customSwipeAdapter.java

    public class customSwipeAdapter extends PagerAdapter {

            private Firebase mRef;

            private Context ctx;
            private LayoutInflater layoutInflator;
            public customSwipeAdapter(Context ctx) {
                this.ctx = ctx;
            }

            private int[] frontImages = {R.drawable.amen_parham, R.drawable.janel_parham, R.drawable.kevin_parham};

            // Populate ArrayList with firebase data
            List<String> savedImages = new ArrayList<String>();

            Boolean goingToCallOnce = false;
            Boolean finishedLoadingData = false;

            @Override
            public int getCount() {
                return savedImages.size();
            }

            @Override
            public boolean isViewFromObject(View view, Object o) {
                return (view == o);
            }

            @Override
            public Object instantiateItem(ViewGroup container, int position) {

                getSavedImages_FromDB();

                layoutInflator = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                final View item_view = layoutInflator.inflate(R.layout.swipe_layout, container, false);

                final EasyFlipView mYourFlipView = (EasyFlipView) item_view.findViewById(R.id.flipView);

                ImageView imageView_Front = (ImageView) item_view.findViewById(R.id.imageView_Front);
                imageView_Front.setImageResource(frontImages[position]);

                container.addView(item_view);

                System.out.println(savedImages);

                return item_view;
            }

            @Override
            public void destroyItem(ViewGroup container, int position, Object object) {
                container.removeView((RelativeLayout)object);
            }

            public void getSavedImages_FromDB() {
                mRef = new Firebase("");

                if (goingToCallOnce == false) {
                   goingToCallOnce = true;
                mRef.child("Q6i3fI6lNdYYS0z5Jty4WUYE9g13").child("SavedImages").addChildEventListener(new ChildEventListener() {

                @Override
                public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                    String savedImage = (String) dataSnapshot.child("Image").getValue();

                        savedImages.add(0, savedImage);

                }

                @Override
                public void onChildChanged(DataSnapshot dataSnapshot, String s) {

                }

                @Override
                public void onChildRemoved(DataSnapshot dataSnapshot) {

                }

                @Override
                public void onChildMoved(DataSnapshot dataSnapshot, String s) {

                }

                @Override
                public void onCancelled(FirebaseError firebaseError) {

                }
            });
        }

        mRef.addListenerForSingleValueEvent(new ValueEventListener() {

            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                finishedLoadingData = true;
                System.out.println("finishedLoadingData");
            }

            @Override
            public void onCancelled(FirebaseError firebaseError) {

            }
        });
    }
}


我建议您首先在活动中从Firebase加载数据,然后将其作为参数传递给适配器的构造函数。这样,您的
CustomSwipeAdapter
将类似于以下内容:

public class customSwipeAdapter extends PagerAdapter {

            private Firebase mRef;

            private Context ctx;
            private LayoutInflater layoutInflator;
            List<String> savedImages = new ArrayList<String>();
            public customSwipeAdapter(Context ctx, List<String> savedImages){
                this.ctx = ctx;
                this.savedImages = savedImages
            }
            ...
            }

我建议您首先在活动中从Firebase加载数据,然后将其作为参数传递给适配器的构造函数。这样,您的
CustomSwipeAdapter
将类似于以下内容:

public class customSwipeAdapter extends PagerAdapter {

            private Firebase mRef;

            private Context ctx;
            private LayoutInflater layoutInflator;
            List<String> savedImages = new ArrayList<String>();
            public customSwipeAdapter(Context ctx, List<String> savedImages){
                this.ctx = ctx;
                this.savedImages = savedImages
            }
            ...
            }

因此,我想澄清一下,您的意思是在我的savedCardsViewController类中获取我的数据,并在数据加载完成后调用我的viewPager.setAdapter(adapter)等等?它希望我将方法“customSwipeAdapter”的第一个参数从“Context”更改为“ValueEventListener”,但当我这样做时,应用程序崩溃了?我将编辑我的问题并提供一个指向上面图片的链接。我刚刚在一个单独的方法中添加了(adapter=new customSwipeAdapter(这个,savedImages);viewPager.setAdapter(adapter);viewPager.setPageTransformer(false,new DefaultTransformer());)并调用了该方法,谢谢你,朋友:)我很高兴你自己解决了之前评论中的问题。不客气:)你知道当添加一个新的savedImages时我将如何更新我的视图吗?因此,请澄清一下,你的意思是在我的savedCardsViewController类中获取我的数据,一旦数据加载完毕,请调用我的viewPager.setAdapter(adapter)等等?它想让我将“customSwipeAdapter”方法的第一个参数从“Context”更改为“ValueEventListener”,但当我这样做时,应用程序会崩溃吗?我将编辑我的问题并提供一个指向上面图片的链接。我刚刚在一个单独的方法中添加了(adapter=new customSwipeAdapter(这个,savedImages);viewPager.setAdapter(adapter);viewPager.setPageTransformer(false,new DefaultTransformer());)并调用了该方法,谢谢你,朋友:)我很高兴你自己解决了之前评论中的问题。不客气:)您是否知道在添加新的savedImages时,我将如何更新视图?
mRef.child("Q6i3fI6lNdYYS0z5Jty4WUYE9g13").child("SavedImages").addListenerForSingleValueEvent(new ValueEventListener() {
                            @Override
                            public void onDataChange(DataSnapshot dataSnapshot) {
                                Iterator<DataSnapshot> data = dataSnapshot.getChildren().iterator();
                                while(data.hasNext())
                                {
                                    String savedImage = (String) data.next().child("Image").getValue();
                                    savedImages.add(0, savedImage);
                                }
                                //Data has finished loading. Load your adapter
                                adapter = new customSwipeAdapter(this, savedImages);
                                viewPager.setAdapter(adapter);
                                viewPager.setPageTransformer(false, new DefaultTransformer());
                            }

                            @Override
                            public void onCancelled(DatabaseError databaseError) {}
                        });