Search code examples
androidandroid-gallery

Android: making gallery infinite loop of images


I'm using a gallery in my project in which I have added four images and I want it to be infinite from both right side and left side. How do I accomplish this?


Solution

  • The main idea is that in your getView method, you have to use

    position = position % imagesArray.length;
    if (position < 0)
        position = position + imagesArray.length;
    

    imagesArray is the array that holds the images in your res folder. For example:

    public class CircularGallery extends Activity {
    /** Called when the activity is first created. */
    private Integer[] imagesArray = { R.drawable.picture1, R.drawable.picture2, R.drawable.picture3, R.drawable.picture4, R.drawable.picture5, R.drawable.picture6 , R.drawable.picture7   }; 
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    
        Gallery g = (Gallery) findViewById(R.id.gallery); 
        g.setAdapter(new ImageAdapter(this)); 
    
        g.setOnItemClickListener(new OnItemClickListener() { 
            public void onItemClick(AdapterView parent, View v, int position, long id) { 
                if (position >= imagesArray.length) { 
                    position = position % imagesArray.length; 
                } 
                Toast.makeText(CircularGallery.this, "" + position, Toast.LENGTH_SHORT).show(); 
            } 
        }); 
    
    }
    
    public class ImageAdapter extends BaseAdapter { 
        int mGalleryItemBackground; 
        private Context mContext; 
    
        public ImageAdapter(Context c) { 
            mContext = c; 
            TypedArray a = obtainStyledAttributes(R.styleable.Gallery1); 
            mGalleryItemBackground = a.getResourceId(R.styleable.Gallery1_android_galleryItemBackground, 0); 
    
            a.recycle(); 
        } 
    
        public int getCount() { 
            return Integer.MAX_VALUE; 
        } 
    
        public Object getItem(int position) { 
            if (position >= imagesArraylength) { 
                position = position % mImageIds.length; 
            } 
            return position; 
        } 
    
        public long getItemId(int position) { 
            if (position >= imagesArray.length) { 
                position = position % imagesArray.length; 
            } 
            return position; 
        } 
    
        public View getView(int position, View convertView, ViewGroup parent) { 
            ImageView i = new ImageView(mContext); 
            if (position >= imagesArray.length) { 
                position = position % imagesArray.length; 
            } 
            i.setImageResource(imagesArray[position]); 
            i.setLayoutParams(new Gallery.LayoutParams(80, 80)); 
            i.setScaleType(ImageView.ScaleType.FIT_XY); 
            i.setBackgroundResource(mGalleryItemBackground); 
            return i; 
        } 
    
        public int checkPosition(int position) { 
            if (position >= imagesArray.length) { 
                position = position % imagesArray.length; 
            } 
            return position; 
        } 
    }}
    

    Also, some developers have done such a functionality and you can find sources on their blogs