Ответ 1
Могу ли я узнать больше о том, что вы пытаетесь выполнить?
Во всяком случае, из того, что я могу понять, вы пытаетесь сделать "бесконечный" ViewPager
переход от последнего к первому и наоборот (пожалуйста, поправьте меня, если я ошибаюсь). И вы хотите, чтобы ваш ViewPager
переходил на первую страницу, но прокручивал - а не появлялся из ниоткуда.
Ну, если вы отключите гладкую прокрутку (второй параметр), то она перейдет непосредственно на нужную вам страницу без движения прокрутки (и не будет "изменяться" на другие страницы в пути), и если вы включите гладкую прокрутите, то он просмотрит все виды, поэтому вы увидите, как это было не следующее, а первое.
/*No swipe animation, and no onPageChanged for the page in the middle*/
mPager.setCurrentItem(1, false);
/*The same as if you do not add the second parameter*/
mPager.setCurrentItem(1, true);
/*Your ViewPager scrolls through all the needed views until it arrives at that view.*/
mPager.setCurrentItem(1);
То, что я могу вам порекомендовать, заключается в том, что вы можете попытаться добавить "фиктивный" вид в позиции 0 и "последний", а вид в позиции 0 будет таким же, как позиция "последний - 1" и "последний", вид будет таким же, как позиция "1". Итак, вы сделаете все нормально, ЗА ИСКЛЮЧЕНИЕМ, что в OnPageChangeListener вы проверите, будет ли текущая страница позицией "0" или "последняя", и если это так, вы вызовете setCurrentItem ("1", "ложь") или setCurrentItem ("последний - 1 ", false) в зависимости от того, на какой позиции вы сейчас находитесь. Таким образом, вы будете сохранять эффект "смены страницы", выполняя то, что хотите.
Надеюсь, это поможет вам в решении вашей проблемы.
ПРИМЕЧАНИЕ. После того, как вы прибудете в новую позицию, у него может быть небольшое изменение, потому что ему нужно будет загрузить представление для текущего, следующего и последнего просмотров (или если вы на 4. 0+, тогда он будет загружать только фактические должность).
ОБНОВИТЬ:
Если вы измените содержимое списка/массива, определяющего содержимое ViewPager
, вам необходимо позвонить:
ViewPager mPager = new ViewPager();
mPager.getAdapter().notifyDataSetChanged(); //This notify that you need to recreate the views
/*This is if you want to change the data and then go to a specific position
If you do not do this you will have a very Buggy Behavior*/
new Handler().post(new Runnable() {
@Override
public void run() {
mPager.setCurrentItem(2); //Where "2" is the position you want to go
}
});
ОБНОВЛЕНИЕ 2:
Почему вы не добавляете все свои элементы в ViewPager
? у ViewPager
уже есть оптимизация для обработки этих случаев, в моем случае у меня много элементов в нем, и он работает как шарм.
Другое дело, в вашем коде я вижу, что вы переходите на среднюю страницу каждый раз, когда страница "поселяется". Но тогда вы действительно никогда не показываете правый и левый вид, так почему вы их имеете?
Последнее, когда вы меняете свой набор данных, вам нужно вызвать метод notifyDataSetChanged, о котором я упоминал выше, а затем вы вызываете метод setCurrentItem внутри обработчика. Если вы этого не сделаете, ваше приложение не будет работать должным образом.
ОБНОВЛЕНИЕ 3:
Единственное, что я могу порекомендовать, это иметь Список, в котором вы продолжаете добавлять новые объекты, которые вы приносите из базы данных, а затем, пока вы продолжаете вставлять объекты в конец списка, нет проблем. Если вы хотите добавить объекты в середине или в начале, вам нужно вызвать notifyDataSetChanged, но это будет медленным, потому что оно снова сгенерирует представления. Мы делаем это так, и это работает отлично, и мы даже загружаем информацию с сервера, данные не являются локальными (и на самом деле мы добавляем информацию до конца и начала списка).
Если у вас есть другие вопросы о том, как достичь этого, не стесняйтесь спрашивать.
ОБНОВЛЕНИЕ 4:
На всякий случай, если кто-то действительно ищет круговой ViewPager
, я добавил доказательство кода концепции, которое вы можете повторно использовать. Он работает без проблем, и я использовал его со сложными видами, и все еще нет отставания.