在第一页上select的ViewPager onPageSelected

所以看起来在使用ViewPager时,onPageSelected监听器不会像第一页那样被调用。

我有一些逻辑,为当前选定的页面填充一些更昂贵的UI元素,这在页面更改时有效,但it doesn't work for the first page.

如果我在侦听器之后设置了当前项目,callback会被触发,但是视图尚未初始化,所以我无法操作它:

 // 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.onAttachedToWindowActivity.onResume这样做,但是在PagerAdapter.instantiateItem之前,它们都会被触发。

Solutions Collecting From Web of "在第一页上select的ViewPager onPageSelected"

尝试使用片段!

 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; } } 

并创build3个片段类

例如:

  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.! } } 

我想知道为什么你不只是有你在片段本身提到的逻辑,而不是托pipe活动。 ViewPager会caching当前一个片段的两个片段,这样它们就可以在后台进行设置,并在用户滑动到这些片段时准备好。 将逻辑放在onPageSelected将意味着绕过这个function,而不是做繁重的工作,直到用户滑动到页面。

假设由于某种原因,你不能做到上述,为什么不使用一个callback函数的接口 。 在片段的onCreateView函数中触发callback,让Activity知道它是完全实例化的。

我的解决scheme是扩展寻呼机适配器,并在其中创build一个接口。 然后让适配器在创build适配器后只调用一次接口。 在接口callback里,你可以调用onPageChanged方法而不会有nullpointerexception。 将此类添加到您的项目中,并从中扩展您的适配器。 在将适配器设置为viewpager之前,不要忘记将监听器设置为适配器。 适配器类如下:

 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);