Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Options for replacing the deprecated Gallery

I am currently using the Gallery widget to display a sliding list of thumbnails. Each thumbnail has a background colour and a text overlay. (It's a colour chooser).

However as of API version 16, the gallery is deprecated.. As I understand it, phones with API versions greater than 16 aren't guaranteed to have the gallery widget.

I would use a viewpager, but that only shows one view at a time, and I want to show adjacent views too. A horizontal scroll view may do it, but it won't snap to the nearest option like a gallery will.

I've looked for existing widgets, and can't find any. Do you have any suggestions as to what widget I should choose?

like image 839
Todd Davies Avatar asked Apr 05 '13 12:04

Todd Davies


3 Answers

A good option to replace the Gallery is a ViewPager, works as a listview or gridview, you have to made your own adapter that extends PagerAdater and a layout item. I already use it with this code i attach below, and it works perfectly. good touch response, i hope this can help you out!!!

LAYOUT

<android.support.v4.view.ViewPager
    android:id="@+id/gallery_item"
    android:layout_width="fill_parent"
    android:layout_height="709dp"
    android:layout_below="@+id/relative_headerBar"
    >

</android.support.v4.view.ViewPager> 

CLASS CODE

private ViewPager gallery;
gallery = (ViewPager) findViewById(R.id.gallery_item);

gallery = (ViewPager) findViewById(R.id.gallery_item);
    lista_galeria = new ArrayList<ObjectVerGaleria>();

    int i=0;
    for(i=0;i<listImages.length;i++)
    {       
        ObjectVerGaleria objV = new ObjectVerGaleria();
        objV.setUrlImg(listImages[i]);  
        lista_galeria.add(objV);
    }
    gallery.setAdapter(new AdapterVerGaleria(ctx, lista_galeria));

    gallery.setOnPageChangeListener(new OnPageChangeListener()
    {

        public void onPageSelected(int pos)
        {
            String pathImage = listImages[pos].toString();

            currentPosFront = pos;
            Log.d("setOnItemSelectedListener>>","path:"+pathImage);

        }

        public void onPageScrolled(int arg0, float arg1, int arg2)
        {
            // TODO Auto-generated method stub

        }

        public void onPageScrollStateChanged(int arg0)
        {
            // TODO Auto-generated method stub

        }
    });

ADAPTER

public class AdapterVerGaleria extends PagerAdapter {

private Activity ctx;
private ArrayList<ObjectVerGaleria> dataList;

public AdapterVerGaleria(Activity act, ArrayList<ObjectVerGaleria> lista) {

    ctx = act;
    dataList = lista;
}

public int getCount() {
    return dataList.size();
}

public Object getItem(int pos) {
    return pos;
}

@Override
public Object instantiateItem(View collection, int pos)
{
    ImageView foto = new ImageView(ctx);



        //foto.setLayoutParams(new ViewPager.LayoutParams(Gallery.LayoutParams.FILL_PARENT, Gallery.LayoutParams.FILL_PARENT));
        foto.setScaleType(ImageView.ScaleType.FIT_XY);
        Utils.fetchDrawableOnThread(Utils.getPath(ctx)+"/"+dataList.get(pos).getUrlImg(), foto, true);
        ((ViewPager)collection).addView(foto);


    return foto;
}

@Override
public void destroyItem(View collection, int position, Object view)
{
    ((ViewPager)collection).removeView((ImageView)view);

}

public long getItemId(int pos) {
    return pos;
}



@Override
public boolean isViewFromObject(View view, Object object)
{
    // TODO Auto-generated method stub
    return view == ((ImageView)object);
}

}

like image 86
user3050757 Avatar answered Oct 18 '22 14:10

user3050757


I used a ViewPager with the it's clipToPadding set to false and equal padding values on the left and the right. This makes a page smaller than the viewpager and center it inside it.

Then I set the viewPager.setPageMargin to a negative value to allow the pages on either side to become visible. This way you have a centered page with others showing.

Then you can also add some fancy animation by setting a PageTransformer on the ViewPager (viewPager.setPageTransformer). I did a rotation and scale using the provided float in the PageTransformer to emulate a carousel like effect.

I hope this is helpful for somebody. Also I think the Gallery was deprecated because the flinging just doesn't feel right. You have no idea which item will be selected after a fling.

like image 33
Pepijn Avatar answered Oct 18 '22 14:10

Pepijn


Someone wrote a replacement for gallery that recycles it's views. It's based on the original gallery code, so it should be an improvement. Here's the link: https://github.com/falnatsheh/EcoGallery

like image 42
mtbomb Avatar answered Oct 18 '22 12:10

mtbomb