Cómo crear slide de imágenes con ViewPager y Glide en Android

publicado por: Anonymous

Tengo un slide de imágenes usando un ViewPager que previamente se cargan la imágenes y son enviadas al ViewPager, Tengo lo siguiente:

layout donde se muestra el viewpager

<android.support.v4.view.ViewPager
    android:id="@+id/vp_photogallery"
    android:layout_width="match_parent"
    android:layout_height="240dp" />

CustomPagerAdapter.java

class CustomPagerAdapter extends PagerAdapter {

    private static final String TAG = "ImageViewPage";
    Context mContext;
    LayoutInflater mLayoutInflater;

    private int[] mResourceIds;

    public CustomPagerAdapter(Context context, int[] resourceIds) {
        mContext = context;
        mResourceIds = resourceIds;
        mLayoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() {
        return mResourceIds.length;
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == object;
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        Log.d(TAG, "instantiateItem() called with: " + "container = [" + container + "], position = [" + position + "]");
        View itemView = mLayoutInflater.inflate(R.layout.pager_item, container, false);

        ImageView imageView = (ImageView) itemView.findViewById(R.id.iv_photo);
        imageView.setImageResource(mResourceIds[position]);

        container.addView(itemView);

        return itemView;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        Log.d(TAG, "destroyItem() called with: " + "container = [" + container + "], position = [" + position + "], object = [" + object + "]");
        container.removeView((LinearLayout) object);
    }
}

pager_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <ImageView
        android:id="@+id/iv_photo"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:contentDescription="@string/about_alt_icon" />
</LinearLayout>

Cargo el slide de imágenes de esa forma

    int[] resourceIds = new int[]{
            R.drawable.no_content
    };

    ViewPager viewPager = (ViewPager) findViewById(R.id.vp_photogallery);

    if (viewPager != null) {
        viewPager.setAdapter(new CustomPagerAdapter(this, resourceIds));
    }

Lo que intento ahora es que las imágenes no sean recursos internos de la app, sino que se carguen des de una url, usando la librería Glide, la fuente de las imágenes quiero que sea un array de strings y dentro del ViewPager se descarguen las imágenes y visualización en el ImageView, en caso de que el array este vacio cargue el recurso interno drawable/no_content.

solución

Buenos días, aquí te dejo un ejemplo:

    String[] myUrls;

       @Override
        public Object instantiateItem(ViewGroup container, int position) {
            Log.d(TAG, "instantiateItem() called with: " + "container = [" + container + "], position = [" + position + "]");
            View itemView = mLayoutInflater.inflate(R.layout.pager_item, container, false);

            ImageView imageView = (ImageView) itemView.findViewById(R.id.iv_photo);

            Glide
            .with(mContext)
            .load(myUrls[position])
            .error(R.drawable.no_content)
            .into(imageView);

            container.addView(itemView);

            return itemView;

Yo no he usado Glide pero en el caso de Picasso si una Url viene vacía te va a dar error, rellena la String con algo por ejemplo “noUrl”:

.load(!myUrls[position].trim().isEmpty() ? myUrls[position] : "noUrl")

Entonces intentará cargar la url y al no encontrarla cargará la imagen que se encuentre en .error(R.drawable.no_content)

Un saludo.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *