我的活动有3个片段(A,B,C)。片段A由ViewPager
2组成ListFragments
。用户可以点击任意一个列表片段中的一个项目,然后转到片段B。
在片段AI中:
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
pagerAdapter = new PagerAdapter(getActivity().getSupportFragmentManager());
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragmentA, container, false);
vpPager = (ViewPager)view.findViewById(R.id.vpPager);
vpPager.setOffscreenPageLimit(2);
vpPager.setAdapter(pagerAdapter);
vpPager.addOnPageChangeListener(this);
return view;
}
并且PagerAdapter
如下:
private class PagerAdapter extends FragmentPagerAdapter {
private final ListFragment1 lf1 = ListFragment1 .newInstance();
private final ListFragment2 lf2 = ListFragment2 .newInstance();
public PagerAdapter(android.support.v4.app.FragmentManager fm) {
super(fm);
}
@Override
public android.support.v4.app.Fragment getItem(int position) {
switch (position) {
case 0: return lf1;
case 1: return lf2;
default: return null;
}
}
}
第一次显示活动时,正确显示viewpager列表片段。
2个viewpager片段从db加载数据,而我只执行一次(创建片段时)。
用户可以点击一个项目,然后显示片段B。如果用户按Back,则会显示片段A。但是,列表片段未显示(它们的实例仍然存在)。
即使存在实例,也可能是视图已被破坏了吗?
这是怎么了 有没有更好的方法?
编辑
如果newInstance
在寻呼机适配器中使用,则会显示IllegalStateException: not attached to activity
。这是因为我按如下方式启动了异步任务:
@Override
public void onPageSelected(int position) {
Fragment fragment = pagerAdapter.getItem(position);
if (fragment instanceof IPagedFragment) {
((IPagedFragment) fragment).onShown();
}
}
并且onShown
是:
@Override
public void onShown() {
myTask= new MyTask();
myTask.execute((Void)null);
}
我什么时候可以开始执行任务,以便可以100%确定该片段已附加到活动上,并且已经创建了视图(我需要从布局中获取listview等)。
我会创建类似:
private class PagerAdapter extends FragmentPagerAdapter {
private final ListFragment1 lf1 = ListFragment1 .newInstance();
private final ListFragment2 lf2 = ListFragment2 .newInstance();
public PagerAdapter(android.support.v4.app.FragmentManager fm) {
super(fm);
}
@Override
public android.support.v4.app.Fragment getItem(int position) {
switch (position) {
case 0: return lf1;
case 1: return lf2;
default: return null;
}
}
@Override
public int getCount() {
return 2;
}
@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
super.setPrimaryItem(container, position, object);
if (position == 0)
lf1.updateUI(); //Refresh what you need on this fragment
else if (position == 1)
lf2.updateUI();
}
}
getCount()
。vpPager.setOffscreenPageLimit(2)
vpPager.addOnPageChangeListener(this)
,这没有用,这可能会导致您遇到一些问题。无论您需要做什么,都可以通过覆盖分页来实现,而无需使用它,就可以“破坏”某些标准分页(因为未调用超级)本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句