我想在我的ViewPager的每个页面中放置图像(就像一本书)。这些图片来自网址列表:
我的适配器看起来像这样:
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) {}
}
并且我通过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);
}
事情是它根本不起作用。
答案 0 :(得分: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]);
}
我认为你不必在for循环中这样做。您也许可以查看兼容性库中的示例。我认为它会自动为一个位置实例化一个项目。这是我在谷歌搜索后找到的一个示例 -
@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;
}
答案 1 :(得分:2)
之前我从未使用过PagerAdapter
,但我怀疑你可以在instantiateItem
中返回一个视图,然后才下载资源(在AsyncTask
中)。当AsyncTask
设置背景图片时,我认为为时已晚,适配器已经返回了视图......
您可能需要在某个时候使视图无效......
答案 2 :(得分:2)
我很抱歉这是一个错误但哇我甚至无法形容 - &gt;我没有把Permission:
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
我把
d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicWidth());
在onPostExecute中,因为我不想让图像变得奇怪。