ViewPager onPageSelected为第一页

lyr*_*cat 23 android android-viewpager

所以看来使用ViewPager时,将使用onPageSelected听者不会被调用第一页相同的问题,因为这个.

我有一些逻辑,为当前选定的页面填充一些更昂贵的UI元素,这在页面更改时有效,但是 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); 
Run Code Online (Sandbox Code Playgroud)

这里view最终为null因为PagerAdapter.instantiateItem尚未运行.所以我想我的问题是,在活动生命周期的哪一点,我可以确定ViewPager已经初始化了视图?我尝试在里面做这个Activity.onAttachedToWindow,Activity.onResume但看起来这两个都被解雇了PagerAdapter.instantiateItem.

brk*_*rk3 5

我想知道你为什么不只是在Fragment本身提到的逻辑而不是托管活动.ViewPager缓冲当前一侧的几个片段,以便它们在后台设置,并在用户滑动时准备好.将逻辑放入onPageSelected将意味着绕过此功能,并且在用户滑动到页面之前不会进行繁重的操作.

假设由于某种原因您不能执行上述操作,为什么不使用具有回调函数接口.触发片段onCreateView函数中的回调,让Activity知道它已完全实例化.


小智 2

尝试使用碎片!

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

并创建3个fragment类

例如:

    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.!
        }
    }
Run Code Online (Sandbox Code Playgroud)