В 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
.