简体   繁体   中英

Imageview and PagerAdapter

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...

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM