android - 重新加载 ViewPager 不会创建前 3 个 fragment

标签 android android-fragments android-viewpager viewpagerindicator

我有一个基于 SherlockFragment 的 fragment ,其中包括一个通过 FragmentStatePagerAdapter 使用 fragment 操作的 ViewPager。我实现了“无限”滚动,因此适配器返回 getCount() 1000。它有效。当我用另一个数据替换()主要 Activity 的主要 fragment 时出现问题,这个主要 fragment 的 onCreateView 在第一次初始化期间被调用:我重新创建适配器并将其设置为 ViewPager,运行 notifyDataSetChanged() 并设置相关 View 设置当前项目()。此时我没有看到 fragment ,因为没有调用 getItem() 。如果我向左或向右滑动 ViewPager,将显示从中间开始的第 3 个 fragment ,然后一切正常,即仅在滑动期间调用 getItem():

@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() 解决了所有这些问题。现在:

  • 重新加载主 fragment 会导致重新加载分页器中的相关 fragment (调用 onCreateView())

  • 同时实例化一个以上的 ViewPager 实例是没有问题的。

关于android - 重新加载 ViewPager 不会创建前 3 个 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14854769/

相关文章:

android - Activity 在奇怪的延迟后显示

android - 如何保存谷歌登录集成 Firebase

android - 将触摸传递给下的 View

java - 带 fragment 的选项卡布局

java - SocketChannel 还没有准备好

android - Javah 缺少 android.os.Parcelable

android - 如何在 Android Activity 的元素周围绘制一个矩形框?

android - 弹出窗口以在 fragment 中显示一些东西

java - 我的fragmentClass在medod onContextItemSelected中从ViewPager获取错误的页面

android - Activity 中的 float 操作按钮 - 如何锚定到 fragment 中的回收 View ?