Android View Pager автоматически запускается и прокручивается автоматически через 5 секунд. В моем коде это занимает даже двойное время
В моем журнале текущая позиция вызывается дважды для одного и того же значения, а мой таймер занимает почти два раза. NUM_PAGES фактически принимает максимальный размер моего списка массивов.
NUM_PAGES = detailsArrayList.size();
// Auto start of viewpager
final Handler handler = new Handler();
final Runnable Update = new Runnable() {
public void run() {
if (currentPage == NUM_PAGES) {
currentPage = 0;
}
Log.d(TAG, "Current Page: " + currentPage);
mPager.setCurrentItem(currentPage++, false);
}
};
final Timer swipeTimer = new Timer();
swipeTimer.schedule(new TimerTask() {
@Override
public void run() {
handler.post(Update);
}
}, 5000, 5000);
// Pager listener over indicator
indicator.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageSelected(int position) {
currentPage = position;
}
@Override
public void onPageScrolled(int pos, float arg1, int arg2) {
}
@Override
public void onPageScrollStateChanged(int pos) {
}
});
1 ответ
Я пробовал похожий упрощенный фрагмент кода, показанный ниже:
открытый класс MainActivity расширяет ActionBarActivity { int counter = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
timer.schedule(new TimerTask() {
@Override
public void run() {
handler.post(Update);
}
}, 500, 500);
}
// Auto start of viewpager
final Timer timer = new Timer();
final Handler handler = new Handler();
final Runnable Update = new Runnable() {
public void run() {
Log.d("TimerTest", "First Log: " + counter);
try {
Thread.sleep(50);
} catch (InterruptedException e) {
Log.d("TimerTest", e.toString());
}
//Log.d("TimerTest", "Second Log: " + counter);
setCounter(counter++);
}
};
void setCounter(int c) { counter = c; }
Результат кода:
03-01 19:03:25.936 11865-11865/il.co.falk.timertest D/TimerTest: First Log: 0
03-01 19:03:26.436 11865-11865/il.co.falk.timertest D/TimerTest: First Log: 0
03-01 19:03:26.946 11865-11865/il.co.falk.timertest D/TimerTest: First Log: 0
03-01 19:03:27.456 11865-11865/il.co.falk.timertest D/TimerTest: First Log: 0
03-01 19:03:27.966 11865-11865/il.co.falk.timertest D/TimerTest: First Log: 0
03-01 19:03:28.476 11865-11865/il.co.falk.timertest D/TimerTest: First Log: 0
Причина этого в том, что оператор приращения (++) - это постфикс. Возвращает старое значение и затем увеличивается.
С этого момента я могу только строить догадки. У вас нет функции set, но у вас есть что-то похожее с onPageSelected. Он вызывается, когда страница становится выделенной. Я предполагаю, что у вас есть состояние гонки. Если это произойдет после приращения, вы останетесь на месте, как в моем примере. В противном случае страница переместится на единицу.