OnPageSelected не работает для первой страницы

Мой адаптер пейджера (расширяет PagerAdepter) имеет в нем текстовое представление. И я обновляю это текстовое представление с помощью функции MainActivity onPageSelected. Его текстовое представление update для position> 0, но стартовая страница (позиция 0) не обновляется при запуске. Когда я прокручиваю вперед, а затем откидываюсь назад; Он устанавливает значение для позиции 0, но я не мог установить значение ON START. Как установить значение для звездной страницы?

public void onPageSelected(int position) { switch (position) { case 0: PagerAdapter.tv.setText("value"); // => doesnt work on start break; default: PagerAdapter.tv.setText("value"); break; } } 

Полный код:

 public class QuizStart extends SlidingFragmentActivity { @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setContentView(R.layout.activity_main); mPager = (ViewPager)findViewById(R.id.pager); QuestionPagerAdapter mAdapter = new QuestionPagerAdapter(); mPager.setAdapter(mAdapter); QuizStart.onPageSelected(0); mPager.setOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageScrollStateChanged(int arg0) { } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageSelected(int position) { switch (position) { case 0: PagerAdapter.tv.setText("value"); // => doesnt work on start break; default: PagerAdapter.tv.setText("value"); break; } } }); } } 

Вы можете вручную вызвать onPageSelected(0) когда вы создаете свой OnPageChangeListener чтобы установить начальное состояние:

 OnPageChangeListener pageChangeListener = new OnPageChangeListener() { @Override public void onPageScrollStateChanged(int arg0) { } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageSelected(int position) { switch (position) { case 0: QuizStart.next.setText(getmycurrentpage()+""); break; default: QuizStart.next.setText(getmycurrentpage()+""); break; } } }); mPager.setOnPageChangeListener(pageChangeListener); // do this in a runnable to make sure the viewPager's views are already instantiated before triggering the onPageSelected call mPager.post(new Runnable() { @Override public void run() { pageChangeListener .onPageSelected(viewPager.getCurrentItem()); } }); 

редактировать

Теперь он не получит Null Pointer exception как указано в @ metemet06

Для меня следующий код

  viewPager.addOnPageChangeListener(myOnPageChangeListener); 

,

  ViewPager.OnPageChangeListener myOnPageChangeListener = new ViewPager.OnPageChangeListener() { //declare key Boolean first = true; @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { if (first && positionOffset == 0 && positionOffsetPixels == 0){ onPageSelected(0); first = false; } } @Override public void onPageSelected(int position) { //do what need } @Override public void onPageScrollStateChanged(int state) { } }; 

Моим решением было расширить адаптер пейджера и создать внутри него интерфейс. Затем сделайте переход адаптер сразу после создания адаптера. Внутри обратного вызова интерфейса вы можете вызывать метод onPageChanged без использования исключения nullpointer. Добавьте этот класс в свой проект и увеличьте его адаптер. Не забудьте установить прослушиватель адаптера, прежде чем устанавливать адаптер на просмотрщик. Класс адаптера ниже:

 public abstract class ExtendedPagerAdapter extends FragmentPagerAdapter { private boolean instantiated; private AdapterListener adapterListener; public interface AdapterListener { void onAdapterInstantiated(); } public ExtendedPagerAdapter(FragmentManager fragmentManager) { this(fragmentManager, null); } public ExtendedPagerAdapter(FragmentManager fragmentManager, AdapterListener adapterListener) { super(fragmentManager); this.adapterListener = adapterListener; instantiated = false; } @Override public void finishUpdate(ViewGroup container) { super.finishUpdate(container); if (!instantiated) { instantiated = true; if (adapterListener != null) { adapterListener.onAdapterInstantiated(); } } } public void setAdapterInstantiatedListener(AdapterListener adapterListener) { this.adapterListener = adapterListener; } } 

Я исправил проблему в своем приложении, добавив код, который должен быть выполнен для первой страницы в методе onCreate () моей активности.

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

Вызов onPageSelected () вручную вызвал NullPointerExceptions, просто das, описанный в других комментариях выше.

Мне кажется, что то, что вы действительно хотите сделать, это переопределить getPageTitle() , а затем, где-то еще, захватить этот заголовок страницы и установить его как текст TextView.

Таким образом, когда вы инициализируете свою деятельность, инициализируйте PagerAdapter и вызовите getTitle(0) . Это даст вам название для страницы 0. Теперь установите это в текстовом представлении Activity. Позже, всякий раз, когда вы меняете страницы, просто вызывайте getTitle(newPosition) и обновляете TextView.

Вероятно, вы используете некоторые AsyncTasks для загрузки набора данных, и трудно определить, какая задача будет последней. И только после этой последней задачи, когда весь набор данных завершен, вы можете вызвать OnPageSelected, потому что он выполняет флеш в пользовательском интерфейсе по всему набору данных.

Вместо вызова функции OnPageSelected вручную, когда страница загружается в первый раз, скорее создайте пользовательский интерфейс поэтапно «обычным» каналом. Позже, когда пользователь меняет страницу, набор данных должен быть полным и сохранить, чтобы обновление было сделано в функции OnPageSelected.

Поскольку я сделал то, что было предложено здесь, и это не сработало, я опубликую то, что для меня работало, добавляет функцию создания экземпляров в onPageScrolled, например:

  @Override public void onPageScrolled(int arg0, float arg1, int arg2) { adapter.closeText(arg0, viewPager); } 

Вероятно, причина этого в том, что onPagesScrolled активируется дальше по линии диспетчера задач Android, поэтому мы предотвращаем нежелательную ситуацию, когда страница раздувается, пропуская приставку слушателей к просмотру.

Этот код работает для меня. Сначала инициализируйте прослушиватель страницы. После setCurrentItem.

 viewPager.setAdapter(adapter); viewPager.setOffscreenPageLimit(1); final ViewPager.OnPageChangeListener listener = new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { } @Override public void onPageScrollStateChanged(int state) { } }; viewPager.addOnPageChangeListener(listener); viewPager.setCurrentItem(position); 

На самом деле я нашел хороший способ, основанный на этом ответе .

Проблема в том, что ViewPager не полностью загружен, когда слушатель настроен, вызывается первая страница, но фрагменты внутри ViewPager еще не полностью инициализированы.

Чтобы исправить это, я просто держу переменную, чтобы знать, была ли первая страница вызвана или нет:

 private boolean mFirstPageCalled = false; 

Затем в слушателе:

 @Override public void onPageSelected(int position) { if(mFirstPageCalled) { // Do your thing } else { mFirstPageCalled = true; } } 

Последнее, что нужно сделать, это обработать первую страницу, которая была пропущена, это можно сделать после того, как ViewPager был полностью создан с помощью:

  mViewPager.post(new Runnable(){ @Override public void run() { // Do your thing } }); 

В моем случае я просто перезвонил сюда, показанный текущий фрагмент и работающий над ним:

 Fragment currentFragment = mPagerAdapter.instantiateItem(mViewPager, mViewPager.getCurrentItem()); currentFragment.customAction(); 

Метод post вызывается только один раз, поэтому он идеально подходит для обработки первой страницы.

Мое решение – это расширенный ViewPager

 class MyViewPager extends ViewPager { private List<OnPageChangeListener> _Listeners = new ArrayList<>(); public MyViewPager(Context context) { super(context); } public MyViewPager(Context context, AttributeSet attrs) { super(context, attrs); } @Override public void addOnPageChangeListener(OnPageChangeListener listener) { super.addOnPageChangeListener(listener); _Listeners.add(listener); } @Override public void removeOnPageChangeListener(OnPageChangeListener listener) { super.removeOnPageChangeListener(listener); _Listeners.remove(listener); } @Override public void setCurrentItem(final int item) { if (item != getCurrentItem()) { super.setCurrentItem(item); } else { post(new Runnable() { @Override public void run() { dispatchOnPageSelected(item); } }); } } private void dispatchOnPageSelected(int position) { for (int i = 0, size = _Listeners.size(); i < size; i++) { OnPageChangeListener listener = _Listeners.get(i); if (listener != null) { listener.onPageSelected(position); } } } }