Слайды пейджера Control View с заданием таймера

Я пытаюсь автоматически сдвинуть свой ViewPager с помощью класса TimerTask, кажется, у меня нет надлежащей задержки и периода, он скользит так быстро. Я безуспешно перепробовал все возможные комбинации параметров задержки и периода, все равно так раздражает быстрое скольжение. Ниже приведен код:

class SliderTimer extends TimerTask {
    @Override
    public void run() {
        HomeActivity.this.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                if (viewPager.getCurrentItem() < listSlides.size() - 1) {
                    viewPager.setCurrentItem(viewPager.getCurrentItem() + 1);
                } else {
                    viewPager.setCurrentItem(0);
                }
            }
        });
    }
}

И реализации:

Timer timer = new Timer();
timer.scheduleAtFixedRate(new HomeActivity.SliderTimer(), 10000, 10000);

Пожалуйста, наставьте меня, что лучше всего можно сделать для того же самого.


person Rahul Singh    schedule 05.03.2019    source источник
comment
как быстро тебе это нужно   -  person Manoj Perumarath    schedule 05.03.2019
comment
У меня есть 30 элементов, так что задержка в 1 секунду для каждого будет оценена.   -  person Rahul Singh    schedule 05.03.2019
comment
Что, если пользователь начнет слайд вручную? Это превратится в беспорядок. Чтобы избежать этого, используйте Handler в OnPageChangeListener.   -  person ADM    schedule 05.03.2019
comment
Как это будет?   -  person Rahul Singh    schedule 05.03.2019
comment
Вы можете обратиться к доступной библиотеке github.com/Trinea/android-auto-scroll- просмотр-пейджер. Это помогает тебе   -  person Android Team    schedule 05.03.2019
comment
10000 это 10 секунд, верно? Тогда как ты можешь сказать, что это быстро   -  person Manoj Perumarath    schedule 05.03.2019
comment
Он все равно не работает, я знаю, что это 10 секунд, но он не подчиняется этому параметру.   -  person Rahul Singh    schedule 05.03.2019
comment
@RahulSingh Проверьте мой ответ .. это может вам помочь ..   -  person Parth Lotia    schedule 05.03.2019


Ответы (2)


Я думаю, что использовать Handler лучше, чем TimerTask, в этом случае, если ViewPager тоже может скользить вручную. Сначала создайте Handler и Runnable глобально.

private Handler handler=new Handler();
private Runnable runnable=new Runnable() {
    @Override
    public void run() {
        if(pagerSlider.getCurrentItem()==data.size()-1){
            pagerSlider.setCurrentItem(0,false);
        }else{
            pagerSlider.setCurrentItem(pagerSlider.getCurrentItem()+1);
        }
    }
};

Разместите runnable внутри onPageChange.

 pagerSlider.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener(){
        @Override
        public void onPageSelected(int position) {
            super.onPageSelected(position);
            handler.removeCallbacks(runnable);
            handler.postDelayed(runnable,2000);
        }
    });

Вам нужно опубликовать сообщение в первый раз. Остальное сделает слушатель. Измените задержку в соответствии с вашими потребностями: -

handler.postDelayed(runnable,2000);

Я просто понимаю, что вы, возможно, спрашиваете о скорости прокрутки. Для этого вам нужно использовать Customize Scroller. Перейти в эту ветку.

person ADM    schedule 05.03.2019
comment
Мне нужно переопределить метод onPageChange? - person Rahul Singh; 05.03.2019
comment
Да, как указано выше в ответе. Я думаю, вы спрашиваете о скорости прокрутки. Для этого я прикрепил ссылку выше. Если этот вопрос относится к скорости прокрутки, и вы нашли решение в приведенной выше ссылке, пожалуйста, отметьте его как дубликат. - person ADM; 05.03.2019
comment
братан, пожалуйста, объясните, как использовать этот настраиваемый класс прокрутки, это меня немного сбивает с толку. - person Rahul Singh; 05.03.2019
comment
Все это есть по ссылке выше .. Мне не нужно больше объяснений. - person ADM; 05.03.2019
comment
Что идет в интерполятор? - person Rahul Singh; 05.03.2019
comment
Я реализовал, но все равно не прокручивается. - person Rahul Singh; 05.03.2019
comment
просто используйте new AccelerateDecelerateInterpolator() вместо интерполятора. - person ADM; 05.03.2019
comment
Да, сейчас работает, но это не то, что я хотел, я хотел автоматически прокручивать. - person Rahul Singh; 05.03.2019
comment
для автоматической прокрутки вам нужно использовать код, который я предоставил выше. - person ADM; 05.03.2019
comment
Большое спасибо за вашу помощь, вы спасли мне день, еще одна проблема, которую я не могу увидеть или реализовать метод opPageChange, такого метода нет. - person Rahul Singh; 05.03.2019
comment
Вуаля! Я понял это, еще раз спасибо большое, приятель, ты был так любезен, да благословит тебя Бог, дружище! - person Rahul Singh; 05.03.2019

Попробуй это...

public static final long DELAY_MS = 2000;
public static final long PERIOD_MS = 4000;

new MyTimerHeader(DELAY_MS, PERIOD_MS, viewPager, images_total_length);

public MyTimerHeader(long DELAY_MS, long PERIOD_MS, final ViewPager slider1, final 
int image_name) {
    final int image_name1=image_name;

    final Handler handler = new Handler();
    final Runnable Update = new Runnable() {
        public void run() {

            int currentPage = slider1.getCurrentItem();

            if (currentPage == image_name1 - 1) {
                currentPage = 0;
            }
            else {
                currentPage = currentPage + 1;
            }
            slider1.setCurrentItem(currentPage);
        }



    };

    Timer timer = new Timer(); // This will create a new Thread
    timer .schedule(new TimerTask() { // task to be scheduled

        @Override
        public void run() {

            handler.post(Update);

        }
    }, DELAY_MS, PERIOD_MS);
}
person Parth Lotia    schedule 05.03.2019