2016-04-24 11 views
0

Ich verwende einen ViewPager, um nur einen Teil eines Bildschirms zu wischen (im Gegensatz zur gesamten Ansicht/Seite).Android ViewPager zeigt zweite Seite nicht an?

Ich kann IsViewFromObject hacken, um nur wahr zurückzukehren, und dann mein erstes Bild erscheint, aber mein zweites Bild wird nicht geladen. Irgendwelche Gedanken darüber, was ich hier vermisse? Ich denke, dass immer noch etwas mit meiner isViewFromObject-Methode oder meiner for-Schleife im Instantiate-Element falsch ist.

Hinweis: ZWINGEND NICHT verwendet erweitert FragmentStatePagerAdapter und Erweiterung regulären PagerAdapter.

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 

Meine insertPhoto Methode, die in instantiateItem oben ausgeführt ist:

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

Antwort

0

Die Methode instantiateItem() des PagerAdapter wird für jede Seite aufgerufen, daher sollte nur eine Seite/ein untergeordnetes Element in den Container eingefügt werden.

@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

Das hat funktioniert! Vielen Dank Giso! Dumb Follow-up-Frage, wenn ich, wenn ich die Ansicht zu einem linearen Layout hinzufügen würde, würde ich eine for-Schleife benötigen. Warum ich nicht hier/wie es iteriert über alle Elemente (d. H. Bilder) ohne eine For-Schleife? – Noobprogrammer

+0

@NoobProgrammer: Es tut es nicht. Der ViewPager funktioniert anders. Tatsächlich werden nicht alle Seiten sofort geladen. Stattdessen instanziiert es nur die benachbarten Seiten und zerstört sogar Seiten weiter weg, um Speicher zu sparen. Wie viele Seiten im Speicher gehalten werden, kann mit [setOffscreenPageLimit()] gesteuert werden (http://developer.android.com/reference/android/support/v4/view/ViewPager.html#setOffscopePageLimit%28int%29) –

0

Sie müssen den Blick auf den Behälter hinzuzufügen. Versuchen Sie, Ihre Methode zu ändern, wie hier gezeigt:

@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;   
} 

Es wäre auch besser, wenn Ihr Layout all in XML getan wurde, so dass die insertPhoto Funktion ruft einfach Picasso das Bild zu laden.

+0

danke für die zeit nehmen Francesc! – Noobprogrammer