Как реализовать бесконечную галерею в Android?

Я использую макет галереи в своем приложении. Он работает, когда пользователь перемещает изображения в галерее слева направо (это бесконечно, что означает, что элементы повторяются снова). Но когда пользователь перемещается справа налево и достигает первого элемента, это не так. После этого никакие элементы не приходят. Но я хочу повторить элементы и с этой стороны. Вы можете дать мне несколько советов?

 Gallery g = (Gallery) findViewById(R.id.gallery);
        g.setAdapter(new ImageAdapter(this));
        g.setFocusable(true);
        g.setSelection((int)(Integer.MAX_VALUE / 2) - (Integer.MAX_VALUE / 2)% mImageIds.length);        
        g.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View v, int position, long id) 
            {
                try {
                    imageid=position;
                    ((ImageView)findViewById(R.id.ImageViewlarge)).setImageResource(mImageIds[position]);
                    ((TextView)findViewById(R.id.TextViewImageName)).setText(imgNames[position]);
                     mp = MediaPlayer.create(SeaSpell.this,audioTrack[position]);

                        } catch (Exception e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }

                }
            });


        }

Screenshot Frontgallery

Как я могу сделать круговой вид галереи? Я я могу делать это слева направо бесконечно, но когда я перетаскиваю справа налево, он показывает конечную точку.

5 ответов


в getView:

if(position>21){
    position=0;
}

это должно быть удалено, поскольку оно должно обрабатываться функцией checkPosition.

в checkPosition:

для оператора модуля (%), учитывая a % b если 0 <= a < b тогда результат будет a. Для b <= a < 2*b тогда результат будет a-b, так что если b == a, то результатом 0. Это продолжается для любого положительного целого числа, поэтому проверка должна быть:

if (position > 0)
    position = position % mImageIds.length;

теперь, что вам не хватает из этого обрабатывается случай, когда position < 0.

a    a%3    a    a%3    f(a)
0    0      0    0      0
1    1     -1   -1      2
2    2     -2   -2      1
3    0     -3    0      0
4    1     -4   -1      2
5    2     -5   -2      1
6    0     -6    0      0

в этом случае мы хотим, чтобы он обернулся обратно в конец списка -f(a) в таблице выше.

как видно из таблицы выше, если a отрицательный -b < a <= 0. Также, если мы сделаем f(a) = (a % b) + b мы получаем желаемый результат.

это означает, что логика в checkPosition становится:

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

который должен работать для всех значений position независимо от значения mImageIds.length.


Если кто-то хотел, чтобы он также пошел назад, вы можете реализовать это. Все, что он действительно делает, это начинает галерею посередине.

GalleryName.setSelection((int)( Integer.MAX_VALUE / 2 ) - ( Integer.MAX_VALUE / 2 ) % mImageIds.length);

код адаптера для объяснения риса можно найти здесь:круговая галерея для Андроид?

просто не забудьте использовать предложение gogothee для перемещения начального выбора в среднюю точку диапазона. (так что вы можете прокручивать влево и вправо почти навсегда). Например, я сделал это так:

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.mylayout);

    //get references to UI components
    mGallery = (Gallery) findViewById(R.id.filter_gallery);

    //connect Galleries with adapters
    mGallery.setAdapter(new GalleryAdapter(this));

    //auto-select first image (position 1073741820)
    mGallery.setSelection((int)(Integer.MAX_VALUE/2) - ( (Integer.MAX_VALUE/2) % mImageBuffer.getCount() ) );
}

бесстыдная самостоятельная вилка, просто написал бесконечную прокрутку галереи учебник:

http://blog.blundell-apps.com/infinite-scrolling-gallery/

Я использую те же математические модули, что и @reece, исходный код также можно загрузить.

вы можете использовать изображения на SD-карте или изображения в каталоге /resources/drawable


чтобы сделать первый элемент центром доступного массива:

your_gallery_obj.setSelection ((int) (целое число.MAX_VALUE / 2) - (целое число.Массив / 2 ) % your_array_size);

чтобы сделать средний элемент центром доступного массива:

your_gallery_obj.setSelection ((int) (целое число.Массив/2) + (число.Массив/2) % your_array_size);