Android 重新加载ViewPager不会';t创建前3个片段
我有一个基于SherlockFragment的片段,其中包括一个通过FragmentStatePagerAdapter操作片段的ViewPager。我实现了“无限”滚动,因此适配器返回getCount()1000。它起作用了。当我用另一个数据替换()主活动中的主片段时,问题就出现了。在第一次初始化期间,这个主片段的CreateView调用like:我重新创建适配器并将其设置为ViewPager,运行notifyDataSetChanged()并使用setCurrentItem()设置相关视图。此时我没有看到片段,因为没有调用getItem()。如果我向左或向右滑动ViewPager,则会显示中间的第三个片段,然后一切正常,即仅在滑动期间调用getItem():Android 重新加载ViewPager不会';t创建前3个片段,android,android-fragments,android-viewpager,viewpagerindicator,Android,Android Fragments,Android Viewpager,Viewpagerindicator,我有一个基于SherlockFragment的片段,其中包括一个通过FragmentStatePagerAdapter操作片段的ViewPager。我实现了“无限”滚动,因此适配器返回getCount()1000。它起作用了。当我用另一个数据替换()主活动中的主片段时,问题就出现了。在第一次初始化期间,这个主片段的CreateView调用like:我重新创建适配器并将其设置为ViewPager,运行notifyDataSetChanged()并使用setCurrentItem()设置相关视图。此
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_timebar, container, false);
mPager = (ViewPager)view.findViewById(R.id.timebar_pager);
mTitleIndicator = (TitlePageIndicator)view.findViewById(R.id.timebar_titles);
mPagerAdapter = new MyAdapter(container.getContext(), getSherlockActivity().getSupportFragmentManager(), mPager);
mPager.setAdapter(mPagerAdapter);
mPagerAdapter.setDate(mStartDate, mPagerAdapter.MIDDLE_POSITION);
return view;
}
public class MyAdapter extends FragmentStatePagerAdapter {
public final int FULL_COUNT = 1000;
private final int MIDDLE_POSITION = FULL_COUNT/2;
private long mMiddleFragmentDate;
private ViewPager mViewPager;
public MyAdapter(Context context, FragmentManager fragmentManager, ViewPager viewPager)
{
super(fragmentManager);
mMiddleFragmentDate = mStartDate;
mViewPager = viewPager;
}
public long getMiddlePosDate()
{
return mMiddleFragmentDate;
}
private void refreshData(int position)
{
Log.d("TIMEBAR","@@@@@ refreshData pos=" + position);
mViewPager.setCurrentItem(position);
notifyDataSetChanged();
View localView = mViewPager.findViewWithTag(Integer.valueOf(position));
if (localView != null)
{
Log.d("TIMEBAR","@@@@@ refreshData localView found & != null");
localView.invalidate();
}
mTitleIndicator.notifyDataSetChanged();
}
public Calendar getDateByPosition(int position)
{
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(mMiddleFragmentDate);
cal.add(Calendar.DAY_OF_YEAR, (position - MIDDLE_POSITION) * mNumOfDaysPerView);
return cal;
}
@Override
public void destroyItem(ViewGroup viewGroup, int position, Object object)
{
super.destroyItem(viewGroup, position, object);
}
@Override
public int getCount()
{
return FULL_COUNT;
}
@Override
public Fragment getItem(int position)
{
GregorianCalendar cal = (GregorianCalendar)getDateByPosition(position);
return TimebarFragment.newInstance(position, cal.getTimeInMillis(), mNumOfDaysPerView);
}
@Override
public int getItemPosition(Object paramObject)
{
return POSITION_NONE;
}
@Override
public CharSequence getPageTitle(int position)
{
Calendar cal = getDateByPosition(position);
StringBuilder sb = new StringBuilder();
sb.append(mCalendarUtils.getDayOfMonth(cal));
sb.append(" ");
if (mNumOfDaysPerView > 1) {
sb.append(mCalendarUtils.getMonthNameShort(cal));
} else {
sb.append(mCalendarUtils.getMonthNameLong(cal));
}
if (mNumOfDaysPerView > 1) {
sb.append(" - ");
cal.add(Calendar.DAY_OF_YEAR, mNumOfDaysPerView - 1);
sb.append(mCalendarUtils.getDayOfMonth(cal));
sb.append(" ");
sb.append(mCalendarUtils.getMonthNameShort(cal));
}
if (calNow.get(Calendar.YEAR) != cal.get(Calendar.YEAR)) {
sb.append(",");
sb.append(cal.get(Calendar.YEAR));
}
return sb.toString();
}
public void setDate(long date, int position)
{
mMiddleFragmentDate = date;
refreshData(position);
}
}
最后,使用android-support-v13库代替android-support-v4库,使用getChildFragmentManager()代替getSupportFragmentManager()解决了所有这些问题。现在:
- 重新加载主片段会导致在寻呼机中重新加载相关片段(调用onCreateView()
- 同时实例化多个ViewPager实例没有问题