У меня есть странная проблема с ViewPager, когда я пытаюсь добавить несколько pageChangleListeners. Я попытался ищет пост/вопрос с подобным описанием, но не мог найти так что здесь мы идем:Android ViewPager - несколько pageChangeListener не работает должным образом
короткая версия: только 1 onPageChangeListener является запуск для первой страницы, но на второй странице несколько слушателей запуск.
длинная версия: В моем приложении мне нужно, чтобы каждый ViewPager имел несколько OnPageChangeListeners. даже несмотря на то, что я не смог найти подтверждения в документации по Android, имя функции «addOnPageChangeListener» предполагает, что я могу настроить несколько слушателей на один и тот же ViewPager (особенно потому, что он был «set PageChangeListener» и они изменили его на "добавить PageChangeListener"). Теперь у меня есть некоторый код, который должен выполняться каждый раз, когда страница выбирается в любом ViewPager в моем приложении, так что я сделал свои собственные ViewPager и OnPageChangeListener классов:
public class MyViewPager extends ViewPager
{
private ArrayList<Sequence> mSequenceList;
public MyViewPager(Context context)
{
super(context);
}
public MyViewPager(Context context, AttributeSet attrs)
{
super(context, attrs);
}
@Override
public void setAdapter(PagerAdapter adapter)
{
super.setAdapter(adapter);
mSequenceList = ((MyPagerAdapter)adapter).getSequences();
addOnPageChangeListener(new MyOnPageChangedListener(mSequenceList));
Log.i("aaaaa", "added listener from MyViewPager");
}
}
, а также я сделал свой собственное изменение страницы слушателя:
public class MyOnPageChangedListener implements MyViewPager.OnPageChangeListener
{
private static final String TAG = "MyOnPageChangedListener";
private ArrayList<Sequence> sequenceList;
public MyOnPageChangedListener(ArrayList<Sequence> sequenceList)
{
this.sequenceList = sequenceList;
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels)
{
//do nothing
}
@Override
public void onPageSelected(int position)
{
Log.i("aaaaa", "selecting page " + position + " from my listener");
//do something
}
@Override
public void onPageScrollStateChanged(int state)
{
//do nothing
}
я также это в OnCreate моей деятельности в:
mPageChangedListener = new ViewPager.OnPageChangeListener()
{
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels)
{
//do nothing
}
@Override
public void onPageSelected(int position)
{Log.i("aaaaa", "selecting page " + position + " from activity");
//do something
}
@Override
public void onPageScrollStateChanged(int state)
{
//do nothing
}
};
mViewPager.addOnPageChangeListener(mPageChangedListener);
Log.i("aaaaa", "added listener from activity");
и я использую это в моей деятельности, чтобы вызвать onPageSelected для первой страницы
@Override
protected void onResume()
{
super.onResume();
mViewPager.post(new Runnable()
{
@Override
public void run()
{
mPageChangedListener.onPageSelected(mViewPager.getCurrentItem());
}
});
}
но когда я запускаю приложение, я получаю странное поведение. вот выход журнала:
02-23 03:08:41.192 17147-17147/com.*** I/aaaaa: added listener from MyViewPager
02-23 03:08:41.193 17147-17147/com.*** I/aaaaa: added listener from activity
02-23 03:08:41.273 17147-17147/com.*** I/aaaaa: selecting page 0 from activity
02-23 03:09:03.609 17147-17147/com.*** I/aaaaa: selecting page 1 from my listener
02-23 03:09:03.609 17147-17147/com.*** I/aaaaa: selecting page 1 from activity
, как вы можете видеть, как слушатели будут добавлены, но для первой страницы (индекс 0) только слушатель от активности запускаются в то время как для второй страницы (индекс 1) оба слушателей запускаются.
Это серьезная проблема для меня, так как мой собственный onPageChangedListener должен запускаться для каждой отдельной страницы.
Кто-нибудь знает, почему это происходит и как это исправить?
Да, я заметил, что слишком почти сразу после публикации вопроса LOL (см. Мой ответ). к сожалению, пока ваше решение ** должно работать **, это не так: когда я вызываю «setCurrentItem (mViewPager.getCurrentItem())», он не вызывает метод onPageSelected (в любом из слушателей). –
Правильно, я пропустил, что по умолчанию выбранный элемент равен 0, поэтому его выбор снова не влияет. Отредактированный ответ, решение в значительной степени ваш собственный ответ :) –