I want to put images in each pages of my ViewPager (like a book). Those images came from a list of url :
My Adapter looks like this :
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) {}
}
and i take those images thanks to a 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);
}
the thing is that it doesn't work at all.
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]);
}
I don't think you have to do it in a for loop. You can perhaps look at the sample in compatibility library. I think it automatically instantiate an item for a position. Here is an sample I found after 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;
}
I have never used a PagerAdapter
before but I doubt you can return a view in instantiateItem
and then only after download the resource (in the AsyncTask
). When the AsyncTask
sets the background image, I think it's too late, the adapter has already returned the view...
You'll probably need to invalidate the view at some point...
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With