ViewPager onPageSelected для первой страницы
Итак, кажется, что при использовании ViewPager прослушиватель onPageSelected не вызывается для первой страницы той же проблемы, что и this.
У меня есть некоторая логика, которая заполняет несколько более дорогих элементов пользовательского интерфейса для текущей выбранной страницы, и это работает при изменении страницы, но it doesn't work for the first page.
Если я устанавливаю текущий элемент после прослушивателя, обратный вызов запускается для первой страницы, но представление еще не инициализировано, поэтому я не могу манипулировать им:
// Inside PagerAdapter.instantiateItem
ViewHolder vh = new ViewHolder();
cursor.moveToPosition(position);
vh.view = adapter.newView(context, cursor, null);
// Set position as tag so we can retrieve it with findViewByTag
vh.view.setTag(position);
((ViewPager) collection).addView(vh.view,0);
return vh;
// Inside MyActivity.onCreate
pagerAdapter = new SingleMessagePagerAdapter(this, cursor);
pager = (ViewPager)findViewById(R.id.message_pager);
pager.setAdapter(pagerAdapter);
pager.setOnPageSelectedListener(this);
pager.setCurrentItem(selectedItem);
// Inside MyActivity.onPageSelected
// Retrieve tagged view
View view = pager.findViewWithTag(position);
Здесь view
заканчивается как null, потому что PagerAdapter.instantiateItem
еще не запущен. Итак, я думаю, мой вопрос в том, в какой момент жизненного цикла деятельности я могу быть уверен, что ViewPager инициализировал представление? Я пробовал делать это внутри Activity.onAttachedToWindow
и Activity.onResume
, но кажется, что оба они срабатывают до PagerAdapter.instantiateItem
.
Ответы
Ответ 1
попробуйте использовать фрагменты!
public class SectionsPagerAdapter extends FragmentPagerAdapter {
public SectionsPagerAdapter() {
super(getSupportFragmentManager());
}
@Override
public Fragment getItem(int i) {
Fragment fr = null;
if (i==0)
fr = new sec0frag();
else if (i==1)
fr = new sec1frag();
else if (i==2)
fr = new sec2frag();
return fr;
}
@Override
public int getCount() {
return 3;
}
}
и создать 3 класса фрагментов
например.
public static class sec0frag extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// here is initialize for first time to view pages.!
}
}
Ответ 2
Мне интересно, почему у вас не просто логика, которую вы упоминаете в самом фрагменте, а не в хостинговой деятельности. ViewPager буферизует пару фрагментов с одной стороны от текущей, поэтому они настроены в фоновом режиме и готовы к работе, когда пользователь перебирает их. Включение логики в onPageSelected
означало бы обходить эту функциональность и не делать тяжелую работу до тех пор, пока пользователь не проскочит на страницу.
Предполагая, что по какой-то причине вы не можете сделать выше, почему бы не использовать интерфейс с функцией обратного вызова. Запустите обратный вызов в функции фрагмента onCreateView
, чтобы Мероприятие полностью узнало об этом.
Ответ 3
Моим решением было расширить адаптер пейджера и создать в нем интерфейс. Затем сделайте адаптер, чтобы вызвать интерфейс только один раз после создания адаптера. Внутри обратного вызова интерфейса вы можете вызывать метод 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;
}
}
Код операции:
adapter = new ViewPagerAdapter(getChildFragmentManager());
adapter.setAdapterInstantiatedListener(new ExtendedPagerAdapter.AdapterListener() {
@Override
public void onAdapterInstantiated() {
onPageSelected(viewPager.getCurrentItem());
}
});
viewPager.addOnPageChangeListener(this);
viewPager.setAdapter(adapter);