2016-04-24 19 views
0

私はViewPagerを使って画面の一部だけをスワイプします(View/Page全体ではなく)。Android ViewPagerは2番目のページを表示しませんか?

isViewFromObjectをハックしてtrueを返し、最初のイメージが表示されますが、2番目のイメージはロードされません。私がここで紛失していることに関する考えは?私はisViewFromObjectメソッドで何か間違っているか、またはインスタンス化アイテムでmyループがあると考えています。

注:意図的にFragmentStatePagerAdapterを拡張し、通常のPagerAdapterを拡張して使用しないでください。上記のinstantiateItemで実行されます

private class ScreenSlidePagerAdapter extends PagerAdapter { 

     public ScreenSlidePagerAdapter() {} 


     @Override 
     public Object instantiateItem (ViewGroup container, int position) { 
      LayoutInflater inflater = (LayoutInflater) container.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

      int RLayoutId; 
      RLayoutId = R.layout.images_to_show; //an XML with just a LinearLayout 

      ViewGroup imageLayout = (ViewGroup) inflater.inflate(RLayoutId, null); 

      for (position = 0; position < mImageURLArraylist.size(); position++) { 
       container.addView(insertPhoto("http:" + mImageURLArraylist.get(position))); 
         }//end of for loop 
      return imageLayout; 

     } 

     @Override 
     public boolean isViewFromObject (View view, Object obj) { //Object parameter is received from instantiateItem(ViewGroup, int) 
//loads the first image successfully if i just do return true. 
//doesn't load any of my images when I do return view == ((View) obj); 

       } 


     //one of four methods that you must override when using pageradapters 
     @Override 
     public int getCount() { 
      //tested in debugging and this has the correct size (2) 
      return mImageURLArraylist.size(); //the number of pages the adapter will create. 
       } 

     @Override 
     public void destroyItem (ViewGroup container, int position, Object object) { 
      container.removeView((LinearLayout) object);      

    }//end of ScreenSlidePagerAdapter 

マイinsertPhoto方法:

public View insertPhoto(String path){ 
     LinearLayout layout = new LinearLayout(getActivity()); 
     layout.setGravity(Gravity.CENTER); 
     ImageView imageView = new ImageView(getActivity()); 
     imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE); 
     Picasso.with(getActivity()).load(path).into(imageView); //tried this but got errors when running > resize(layout.getWidth(), layout.getHeight()), also tried .fit() after .load image wouldn't load 
     layout.addView(imageView); 
     return layout;   
} 

答えて

0

PagerAdapterのinstantiateItem()メソッドはページごとに呼び出されるため、1ページ/子のみをコンテナに挿入する必要があります。

@Override 
    public Object instantiateItem (ViewGroup container, int position) { 
     final View page = insertPhoto("http:" + mImageURLArraylist.get(position)); 
     container.addView(page); 
     return page; 
    } 

    @Override 
    public boolean isViewFromObject (View view, Object obj) { 
     return view == obj; 
    } 
+0

これはうまくいった!ありがとうGiso!もし私が、もし私がforループを必要とするだろう、線図レイアウトにViewを追加していたら、ダムフォローアップの質問。なぜ私はここにいないのですか?forループなしのすべてのアイテム(つまり画像)をどのように反復するのでしょうか? – Noobprogrammer

+0

@Noobprogrammer:そうではありません。 ViewPagerの動作は異なります。実際には、すぐにすべてのページを読み込むことさえありません。代わりに、それは隣接するページをインスタンス化し、メモリを節約するためにページをさらに遠ざける。 メモリに保持されるページの数は、[setOffscreenPageLimit()](http://developer.android.com/reference/android/support/v4/view/ViewPager.html#setOffscreenPageLimit%28int%29)で制御できます。 –

0

あなたはコンテナにビューを追加する必要があります。ここに示したように、あなたの方法を変更してみてください:

@Override 
    public Object instantiateItem (ViewGroup container, int position) { 
     LayoutInflater inflater = (LayoutInflater) container.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     int RLayoutId; 
     RLayoutId = R.layout.images_to_show; //an XML with just a LinearLayout 

     ViewGroup imageLayout = (ViewGroup) inflater.inflate(RLayoutId, container, false); 

     container.addView(insertPhoto(imageLayout, "http:" + mImageURLArraylist.get(position))); 
     return imageLayout; 

    } 

// this needs to be refactored, too many viewgroups. Move all layouts to XML 
public View insertPhoto(ViewGroup root, String path){ 
    LinearLayout layout = new LinearLayout(getActivity()); 
    layout.setGravity(Gravity.CENTER); 
    ImageView imageView = new ImageView(getActivity()); 
    imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE); 
    Picasso.with(getActivity()).load(path).into(imageView); //tried this but got errors when running > resize(layout.getWidth(), layout.getHeight()), also tried .fit() after .load image wouldn't load 
    layout.addView(imageView); 
    root.addView(layout); 
    return root;   
} 

あなたのレイアウトはすべてXMLで行われた場合にも良いだろう、そうinsertPhoto機能は、単に画像をロードするためにピカソを呼び出します。

+0

時間をとっていただきありがとうございます。 – Noobprogrammer

関連する問題