1

私のアプリを起動すると、はsavedImages ArrayListがfirebaseのデータを受信して​​データが入力されるまで待つ必要があります。しかし、代わりに私のクラスは実行されており、getCount()メソッドはsavedImages.size()を0に戻しているので、私のarraylistは時間が経ちこんでいないので、私のページ全体は空です。配列リストにデータが入力されたときにクラスを実行している可能性があります。私はあなたがFirebaseからデータをロード示唆するもの、ここで行うには:)空の配列を返すViewPager

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'

答えて

0

わかりませんあなたの活動の最初の次にアダプタのコンストラクタへのパラメータとして渡します。この方法であなたの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からのデータの読み込みに:代わりにonChildAddedのイテレータとSingleValueListenerを使用します。

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

だから明確にするために、どのようなあなたの言うことは、私のsavedCardsViewControllerクラスの中で私のデータを取得し、データのロードが完了したら、私のviewPager.setAdapter(アダプタ)などを呼び出すことです? –

+0

はい、まさに... –

+0

メソッド 'customSwipeAdapter'の1番目のパラメータを 'Context'から 'ValueEventListener'に変更したいのですが、アプリケーションをクラッシュさせるとどうなりますか?私は自分の質問を編集し、 –

関連する問題