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'参数,但是当我做应用程序崩溃?我将编辑我的问题,并给图片上面的链接 –