1

當我開始我的應用我想我customSwipeAdapter.java等到我savedImages ArrayList已收到並填充了從火力點的數據。而是我班正在跑,我的整個頁面是空的,因爲getCount()方法返回savedImages.size()爲0,因爲我的ArrayList尚未及時填充。當我的數組列表填充時,可能會運行我的課程的任何幫助。不知道這裏做什麼:)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 
      } 
      ... 
      } 

另注在加載數據從火力上的活動:使用SingleValueListener有一個迭代器,而不是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

所以我只想澄清,什麼你的說法是抓住我的savedCardsViewController類中的數據,一旦數據完成加載調用我的viewPager.setAdapter(適配器)等? –

+0

是的,沒錯...... –

+0

就是了我改變方法,從「語境」到「ValueEventListener」 customSwipeAdapter「的第1'參數,但是當我做應用程序崩潰?我將編輯我的問題,並給圖片上面的鏈接 –