Я нашел решение: иметь два поддельных элемента в списке (первый и последний элемент), и когда мы прокручиваем от второго до последнего, мы переключаемся на элемент n-2 (-> последний из реального элемента). Но проблема - плохой переход, чтобы увидеть.
Так что я представляю решение, более надежное в моей ситуации: дублируйте два последних элемента и поместите их в начало массива.
- Список до: [A, B, C, D, E, F]
- Список после преобразования: [E ', F', A, B, C, D, E, F]
Идея состоит в том, чтобы сначала отобразить элемент A (позиция 2), когда мы прокручиваем элемент F (позиция n-1), мы принудительно отображаем элемент F '(позиция 1). Когда мы прокручиваем элемент E '(позиция 0), мы вынуждаем отобразить элемент E (позиция n-2) .
Таким образом, при каждой позиции у нас всегда есть элемент слева и элемент справа, и мы всегда можем прокрутить с помощью красивого преобразователя страниц.
Ограничение должно состоять как минимум из двух элементов. Но, конечно, нам не нужно прокручивать только один элемент .
Java код:
public class MyPagerActivity extends Activity {
private ViewPager2 pager;
private final MyPagerAdapter adapter = new MyPagerAdapter();
private ViewPager2.OnPageChangeCallback pageChangeCallback = new ViewPager2.OnPageChangeCallback() {
@Override
public void onPageSelected(final int position) {
super.onPageSelected(position);
currentPosition = position;
onFocusChange();
}
@Override
public void onPageScrollStateChanged(final int state) {
super.onPageScrollStateChanged(state);
if (state == ViewPager2.SCROLL_STATE_IDLE) {
if (currentPosition == 0) {
pager.setCurrentItem(fakeSize - 2, false);
} else if (currentPosition == fakeSize - 1) {
pager.setCurrentItem(1, false);
}
} else if (state == ViewPager2.SCROLL_STATE_DRAGGING && currentPosition == fakeSize) {
//we scroll too fast and miss the state SCROLL_STATE_IDLE for the previous item
pager.setCurrentItem(2, false);
}
}
};
private ArrayList<String> itemList;
private int fakeSize;
private int realSize;
private int currentPosition;
@Override
protected void onCreate(@Nullable final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.pager = findViewById(R.id.mypager_viewpager);
this.pager.setAdapter(this.adapter);
this.pager.registerOnPageChangeCallback(this.pageChangeCallback);
this.pager.setOrientation(ViewPager2.ORIENTATION_HORIZONTAL);
final ArrayList<String> itemList = null;//your data
this.realSize = itemList.size();
this.fakeSize = this.realSize + 2;
this.itemList = transformListAndAddTwo(itemList);
this.adapter.setPublicationList(this.itemList);
final int item = 2; //number two because we have two elements before the chosen one
this.pager.setCurrentItem(item, false);
}
private void onFocusChange() {
//Do something
}
/**
* add two lasts item at beginning on the new array
* @param itemList
* @return
*/
public static ArrayList<String> transformListAndAddTwo(final ArrayList<String> itemList) {
final int size = itemList.size();
final ArrayList<String> listTemp = new ArrayList<>(size + 2);
for (int iPL = 0; iPL <= size + 2; iPL++) {
listTemp.add(itemList.get((iPL + size - 2) % size));
}
return listTemp;
}
}