Imageview和PagerAdapter

时间:2011-07-29 21:16:15

标签: android image android-asynctask android-viewpager android-pageradapter

我想在我的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);
}

事情是它根本不起作用。

3 个答案:

答案 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中,因为我不想让图像变得奇怪。