Search code examples
firebasearraylistfirebase-realtime-databaseandroid-viewpagerandroid-pageradapter

ViewPager returning empty array


When I start my app I want my customSwipeAdapter.java to wait until my savedImages ArrayList has received and been populated with the data from firebase. But instead my class is being ran and my whole page is empty because getCount() method is returning savedImages.size() as 0 because my arraylist hasn't been populated in time. Any help on maybe running my class when my array list is populated. Not sure what to do here :)

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) {

            }
        });
    }
}

savedCardsViewController.java

public class savedCardsViewController extends AppCompatActivity {

    private Swipe swipe;
    ViewPager viewPager;
    customSwipeAdapter adapter;

    private Firebase mRef;

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

        viewPager = (ViewPager) findViewById(R.id.view_pager);
        adapter = new customSwipeAdapter(this);
        viewPager.setAdapter(adapter);
        viewPager.setPageTransformer(false, new DefaultTransformer());

    }
}

'Context' to 'ValueEventListener'

2'nd 'Context' to 'ValueEventListener'


Solution

  • I suggest you load the data from Firebase on your Activity first and then pass it as a parameter to the adapter's constructor. This way your CustomSwipeAdapter would look similar to this:

    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
                }
                ...
                }
    

    Another note on Loading data from firebase on the Activity: use A SingleValueListener with an iterator instead of onChildAdded:

    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) {}
                            });