问题
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.
回答1:
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;
}
回答2:
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...
回答3:
I'm sorry it was a mistake but wow i can't even describe -> I didn't put the Permission :
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
and i put
d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicWidth());
int the onPostExecute because i didn't want the images to be all weird.
来源:https://stackoverflow.com/questions/6879137/imageview-and-pageradapter