因此,当使用ViewPager时,onPageSelected侦听器不会被调用第一页与this相同的问题。
我有一些逻辑为当前选定的页面填充了一些更昂贵的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);
此处view
最终为空,因为PagerAdapter.instantiateItem
尚未运行。所以我想我的问题是,在活动生命周期的哪个阶段我可以确定ViewPager已经初始化了视图?我尝试在Activity.onAttachedToWindow
和Activity.onResume
内执行此操作,但看起来这两个都在PagerAdapter.instantiateItem
之前被触发。
答案 0 :(得分:5)
我想知道你为什么不只是在Fragment本身提到的逻辑而不是托管活动。 ViewPager缓冲当前一侧的几个片段,以便它们在后台设置,并在用户滑动时准备好。将逻辑放在onPageSelected
中意味着绕过此功能,并且在用户滑动到页面之前不会进行繁重的工作。
由于某些原因,您无法执行上述操作,为什么不使用Interface with a callback function。触发片段的onCreateView
函数中的回调,让Activity知道它已完全实例化。
答案 1 :(得分: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;
}
}
并创建3个片段类
e.g。 :
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 :(得分:1)
我的解决方案是扩展寻呼机适配器并在其中创建一个接口。然后在创建适配器后,使适配器仅调用一次接口。在内部接口回调中,您可以调用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);