1

Lorsque je démarre mon application, je veux que mon customSwipeAdapter.java attende que mon savedImages ArrayList ait reçu et ait été rempli avec les données de Firebase. Mais à la place, ma classe est en cours d'exécution et toute ma page est vide car la méthode getCount() renvoie savedImages.size() comme 0 car mon liste n'a pas été renseignée à temps. Toute aide sur l'exécution de ma classe lorsque ma liste de tableaux est remplie. Je ne sais pas quoi faire :)ViewPager retournant le tableau vide

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'

Répondre

0

Je vous suggère de charger les données de Firebase sur votre activité d'abord un d ensuite le passer en paramètre au constructeur de l'adaptateur. De cette façon, votre CustomSwipeAdapter ressemblerait à ceci:

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

Une autre note sur Chargement des données de firebase sur l'activité: utiliser un SingleValueListener avec un itérateur au lieu de 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) {} 
         }); 
+0

Il suffit donc de préciser, ce votre dicton est de saisir mes données dans ma classe savedCardsViewController et une fois que les données ont fini de charger, appelez mon viewPager.setAdapter (adaptateur) et ainsi de suite? –

+0

Oui, exactement ... –

+0

il veut que je change le 1er paramètre de la méthode 'customSwipeAdapter' de 'Context' à 'ValueEventListener' mais quand je fais l'application se bloque? Je vais modifier ma question et donner un lien vers l'image ci-dessus –