6

Je veux mettre des images dans chaque page de mon ViewPager (comme un livre). Ces images proviennent d'une liste d'url:Imageview et PagerAdapter

Mon adaptateur ressemble à ceci:

private class MyPagerAdapter extends PagerAdapter{ 

    @Override 
    public int getCount() { 
      return NUM_AWESOME_VIEWS; 
    } 

/** 
* Create the page for the given position. The adapter is responsible 
* for adding the view to the container given here, although it only 
* must ensure this is done by the time it returns from 
* {@link #finishUpdate()}. 
* 
* @param container The containing View in which the page will be shown. 
* @param position The page position to be instantiated. 
* @return Returns an Object representing the new page. This does not 
* need to be a View, but can be some other container of the page. 
*/ 
    @Override 
    public Object instantiateItem(View collection, int position) { 
     // Create Views 
     ScrollView view = new ScrollView(cxt); 
     RelativeLayout container = new RelativeLayout(cxt); 
     TextView text = new TextView(cxt); 
     text.setId(1); 
     ImageView[] image = new ImageView[18]; 
     // Parameters 
     LayoutParams container_params = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); 
     LayoutParams text_params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
     LayoutParams content_params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
     content_params.addRule(RelativeLayout.BELOW, text.getId()); 

     view.setLayoutParams(container_params); 
     container.setLayoutParams(container_params); 
     text.setLayoutParams(text_params); 
     //image.setLayoutParams(content_params); 

     // set 

     for(int i = 0; i < position; i++){ 
      image[i] = new ImageView(cxt); 
      image[i].setLayoutParams(content_params); 
      createimage(image[i], list_url.get(position)); 
      container.addView(image[i]); 
     } 
     text.setText(list_url.get(position).toString()); 
     // add 
     view.addView(container); 
     container.addView(text); 
     //container.addView(image); 
     ((ViewPager) collection).addView(view,0); 
     return view; 
    } 

/** 
* Remove a page for the given position. The adapter is responsible 
* for removing the view from its container, although it only must ensure 
* this is done by the time it returns from {@link #finishUpdate()}. 
* 
* @param container The containing View from which the page will be removed. 
* @param position The page position to be removed. 
* @param object The same object that was returned by 
* {@link #instantiateItem(View, int)}. 
*/ 
    @Override 
    public void destroyItem(View collection, int position, Object view) { 
      ((ViewPager) collection).removeView((ScrollView) view); 
    } 



    @Override 
    public boolean isViewFromObject(View view, Object object) { 
      return view==((ScrollView)object); 
    } 


/** 
* Called when the a change in the shown pages has been completed. At this 
* point you must ensure that all of the pages have actually been added or 
* removed from the container as appropriate. 
* @param container The containing View which is displaying this adapter's 
* page views. 
*/ 
    @Override 
    public void finishUpdate(View arg0) {} 


    @Override 
    public void restoreState(Parcelable arg0, ClassLoader arg1) {} 

    @Override 
    public Parcelable saveState() { 
      return null; 
    } 

    @Override 
    public void startUpdate(View arg0) {} 

} 

et je prends ces images grâce à un AsyncTask:

private class CreateImage extends AsyncTask<String, Void, Drawable> { 
ImageView image; 
public CreateImage(ImageView img) { 
    image = img; 
} 
protected void onPreExecute() { 
} 

protected Drawable doInBackground(String... urls) { 
    InputStream is; 
    Drawable d = null ; 
    try { 
     is = (InputStream)new URL(urls[0]).getContent(); 
     d = Drawable.createFromStream(is, "Image"); 
     return d; 
    } catch (MalformedURLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    return d; 
} 
protected void onPostExecute(Drawable d) { 
    image.setBackgroundDrawable(d); 
} 
private Drawable ImageOperations(Context ctx, String url) { 
    try { 
    URL imageUrl = new URL(url); 
    InputStream is = (InputStream) imageUrl.getContent(); 
    Drawable d = Drawable.createFromStream(is, "src"); 
    return d; 
    } catch (MalformedURLException e) { 
    e.printStackTrace(); 
    return null; 
    } catch (IOException e) { 
    e.printStackTrace(); 
    return null; 
    } 
    } 
} 
public void createimage(ImageView img, String url){ 
new CreateImage(img).execute(url); 
} 

la chose est qu'il n » t travail du tout.

Répondre

2

Je suis désolé c'était une erreur, mais wow je ne peux pas décrire même -> Je ne l'ai pas mis la permission:

<uses-permission android:name="android.permission.INTERNET"></uses-permission> 

et je mis

d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicWidth()); 

int onPostExecute parce que je ne l'ai pas wan t les images pour être tout bizarre.

2

for(int i = 0; i < position; i++){ image[i] = new ImageView(cxt); image[i].setLayoutParams(content_params); createimage(image[i], list_url.get(position)); container.addView(image[i]); }

Je ne pense pas que vous devez le faire dans une boucle. Vous pouvez peut-être regarder l'exemple dans la bibliothèque de compatibilité. Je pense qu'il instancie automatiquement un article pour une position. Voici un exemple que j'ai trouvé après googling-

@Override 
    public Object instantiateItem(View collection, int position) { 
     TextView tv = new TextView(cxt); 
     tv.setText("Bonjour PAUG " + position); 
     tv.setTextColor(Color.WHITE); 
     tv.setTextSize(30); 

     ((ViewPager) collection).addView(tv,0); 

     return tv; 
    } 
+0

Je connais cet exemple parce que c'est celui que je remplace. Maintenant, j'ai utilisé un gonfleur de mise en page pour gonfler une vue personnalisée, mais cela ne fonctionne toujours pas. – Tsunaze

2

Je ne l'ai jamais utilisé un PagerAdapter avant, mais je doute que vous pouvez retourner une vue en instantiateItem et seulement après le téléchargement de la ressource (dans le AsyncTask). Lorsque le AsyncTask définit l'image d'arrière-plan, je pense qu'il est trop tard, l'adaptateur a déjà retourné la vue ...

Vous aurez probablement besoin d'invalider la vue à un moment donné ...

+0

ok, c'est pourquoi, j'ai laissé un Toast dans le onPostExecute et il est apparu. Mais comment puis-je invalider la vue? – Tsunaze

+0

Simplement avec ['invalidate()'] (http://developer.android.com/reference/android/view/View.html#invalidate()). – rds

+0

J'ai essayé d'invalider la vue mais cela n'a pas fonctionné du tout, j'ai essayé d'invaliderDrawable dans l'Asynctask, cela n'a pas fonctionné non plus. – Tsunaze