6

我想将图像放在 ViewPager 的每一页中(就像一本书一样)。这些图片来自 url 列表:

我的适配器看起来像这样:

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

问题是它根本不起作用。

4

3 回答 3

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;
    }
于 2011-08-07T21:15:53.363 回答
2

我以前从未使用过PagerAdapter,但我怀疑您instantiateItem只能在下载资源后(在 中AsyncTask)返回视图。当AsyncTask设置背景图像时,我认为为时已晚,适配器已经返回视图......

您可能需要在某些时候使视图无效...

于 2011-08-09T09:02:31.310 回答
2

对不起,这是一个错误,但哇,我什至无法描述 -> 我没有输入权限:

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

我把

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

int onPostExecute 因为我不希望图像变得很奇怪。

于 2011-09-18T17:24:01.720 回答