Imageview and PagerAdapter

I want to place images on every page of my ViewPager (e.g. books). These images were obtained from the URL list:

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 these images thanks to asintet:

 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 fact is that it does not work at all.

+6
source share
3 answers

I wish it was a mistake, but wow I can’t even describe β†’ I didn’t set permission:

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

and i put

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

int onPostExecute because I did not want the images to be all weird.

+2
source

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 do not think you need to do this in a for loop. You can see the sample in the compatibility library. I think it automatically creates an element for the position. Here is a 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
source

I have never used the PagerAdapter , but I doubt that you can return the view to instantiateItem , and then only after loading the resource (in AsyncTask ). When AsyncTask sets the background image, I think it's too late, the adapter has already returned the view ...

You will probably need to cancel the view at some point ...

+2
source

Source: https://habr.com/ru/post/893908/


All Articles