Есть несколько способов сделать это, но во всех случаях это никогда не бывает технически «бесконечным».Я получил основу от того, что некоторое время слонялся вокруг.
Сначала нам нужно поместить галерею в файл xml в макете.Итак, после создания файла поместите небольшой фрагмент, подобный следующему:
<!-- Gallery To show images Gallery -->
< Gallery
android:id="@+id/galleryView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:paddingBottom="15dip"/>
Теперь давайте настроим Вектор различных изображений, чтобы мы могли проходить по ним.Мы будем получать эти изображения с наших ресурсов, но если вы хотите получить их откуда-то еще, просто вставьте их.Мы собираемся вставить это в onCreate ().Это позволит нам иметь вектор идентификаторов, на который мы сможем ссылаться при последующем размещении изображений в галерее:
public Vector<Integer> mPhotoVector = new Vector<Integer>();
public void setPhotos() {
for(as many photos as you want){
int imageResource = getResources().getIdentifier("imageNAme", "drawable", getPackageName());
mPhotoVector.add(imageResource);
}
Где galView - мой вид галереи из макета.И когда мы закончим этот проект, нам нужно вызвать представление галереи из xml и инициализировать его в переменную галереи, которую мы будем иметь в коде.
LoopingGalleryAdapter adapter;
Gallery galView;
adapter = new LoopingGalleryAdapter(this, mPhotoVector);
galView = (LoopingGallery)mLayoutView.findViewById(R.id.galleryView);
galView.setAdapter(adapter);
galView.setSelection((galView.getCount() / 2));
setSelection()
заставит нас взглянуть нав середине галереи это выглядит как «бесконечный», поскольку теперь с каждой стороны по 1073741823 элемента.
Далее нам нужно создать адаптер.Основой является создание самой большой галереи, которую вы можете, поэтому далее мы просто добавим наш собственный маленький метод getCount.Это создаст слишком большую галерею для пользователя (правдоподобно), чтобы прокрутить до конца.
Наконец, на адаптере у нас есть основа проекта, которая требует, чтобы мы указали, где наша позиция.Это ключ.Как только позиция установлена на середину галереи, кажется, что у вас есть бесконечный цикл изображений с обеих сторон.
Я начал свою работу примерно так:
public class LoopingGalleryAdapter extends BaseAdapter {
private ImageView iv;
private Context mContext;
public PhotoVector mPhotoVector = null;
int mGalleryItemBackground;
public LoopingGalleryAdapter(Context c, PhotoVector aVector) {
this.mContext = c;
mPhotoVector = aVector;
}
public int getCount() {
return Integer.MAX_VALUE;
}
@Override
public Object getItem(int position) {
return position;
}
public ImageView getImage(){
return iv;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
iv = new ImageView(mContext);
private final int middle = 1073741823; //this is the middle index of the gallery in galView
/************************************************************************
*if you have a vector/array/arrayList of photos you would like to display
************************************************************************/
if((position - middle) >= 0) { relativePosition = (position-middle) % mPhotoVector.size(); }
else { relativePosition = mPhotoVector.size() - (Math.abs(position - middle) % mPhotoVector.size()); }
Drawable draw = mContext.getResources().getDrawable(mPhotoVector.get(relativePosistion));
/*********************************************
*otherwise you can just insert a photo like so
*********************************************/
Drawable draw = mContext.getResources().getDrawable(R.drawable.what_you_want);
iv.setImageDrawable(draw);
return iv;
}
}
И теперь все готово!
Кроме того, один из приемов, которые я нахожу весьма полезными, если они не нужны при получении изображений из Интернета, - это вести учет того, сколько раз вы проходили getView()
и через 10-20 раз очистите свой кеш, чтобы вы не выбросили OutOfMemoryError
, выполнив:
if(counter >= 20){
galView.destroyDrawingCache();
counter = 0;
}
или getView()
бросьте OutOfMemoryError
, поймайте его и верните пустойImageView (iv) и затем очистите, затем позвоните galView.destroyDrawingCache();