Подтвердить что ты не робот

setCurrentItem в ViewPager не прокручивается сразу в правильном положении

Я использую PagerAdapter. У меня много элементов, поэтому я не загружаю все элементы за одно время. Я перезаряжаю адаптер, я меняю старые элементы на новые элементы. Например, у меня есть 4 элемента, когда я прихожу к последнему элементу, я перезагружаю элементы, и я вызываю setCurentItem (1), чтобы показать viewpager в позиции один. Я провел много испытаний. Я кладу:

viewPager.setCurrentItem(1,false); //But not scroll, put drastically the new page.
viewPager.setCurrentItem(1);

Я попытался изменить onPageScrollStateChanged (int arg0), у меня есть только 3 вида и всегда ubicate посередине.

if (arg0 == ViewPager.SCROLL_STATE_DRAGGING) {
    if(focusedPage==2) {
        //Modify adapter
        viewPager.setCurrentItem(1,false);   

    }else if(focusedPage==0){
        //Modify adapter
        viewPager.setCurrentItem(1,false);
    } 

И я попытался изменить onPageSelected (int arg0)

focusedPage=arg0;

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

спасибо

4b9b3361

Ответ 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, я добавил доказательство кода концепции, которое вы можете повторно использовать. Он работает без проблем, и я использовал его со сложными видами, и все еще нет отставания.

Ответ 2

Он не работает без postDelayed, попробуйте с этим кодом:

viewPager.postDelayed(new Runnable()
{
    @Override
    public void run()
    {
        viewPager.setCurrentItem(num, true);
    }
}, 100);