2017-04-14 30 views
0

这是我ViewPager使用不同的数据的一个片段viewPager不起作用

private class ViewPagerAdapter extends FragmentPagerAdapter{ 
     private final List<Fragment> mFragmentList = new ArrayList<>(); 
     private final List<String> mFragmentTitleList = new ArrayList<>(); 


     ViewPagerAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public Fragment getItem(int position) { 
      return mFragmentList.get(position); 
     } 

     @Override 
     public int getCount() { 
      return mFragmentList.size(); 
     } 
     void addFragment(Fragment fragment, String title){ 
      mFragmentList.add(fragment); 
      mFragmentTitleList.add(title); 
     } 

     @Override 
     public CharSequence getPageTitle(int position){ 
      return mFragmentTitleList.get(position); 
     } 
    } 

和主要活动,

public void setupViewPager() { 
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager()); 
    adapter.addFragment(NowPlayingFragment.newInstance(0), getString(R.string.now_playing)); 
    adapter.addFragment(NowPlayingFragment.newInstance(1), getString(R.string.up_coming)); 
    adapter.addFragment(NowPlayingFragment.newInstance(2), getString(R.string.popular)); 
    mViewPager.setAdapter(adapter); 

,这是我的片段。

public static NowPlayingFragment newInstance(int titleId){ 
    NowPlayingFragment fragment = new NowPlayingFragment(); 
    Bundle args = new Bundle(); 
    args.putInt("title_flag", titleId); 
    NowPlayingFragment.titleId = titleId; 
    fragment.setArguments(args); 
    return fragment; 
} 



@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    args = savedInstanceState; 
    mContext = getContext(); 

} 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_now_playing, container, false); 
    mUnbinder = ButterKnife.bind(this, view); 
    Map<String, String> queryString; 
    queryString = ApiUtils.getQueryStrings(mContext); 
    Uri uri; 
    int titleId1 = 0; 
    if (args != null) { 
     titleId1 = args.getInt("title_flag"); 
    } 
    Log.d("tag", "titleId = " + titleId1); 
    switch (titleId1){ 
     case 0: 
      uri = ApiUtils.getNowPlayingUri(mContext, queryString); 
      break; 
     case 1: 
      uri = ApiUtils.getUpcomingUri(mContext, queryString); 
      break; 
     case 2: 
      uri = ApiUtils.getPopularUri(mContext, queryString); 
      break; 
     default: 
      uri = ApiUtils.getNowPlayingUri(mContext, queryString); 
      break; 
    } 

    new loadDiscoverList(getContext()).execute(uri); 

    return view; 
} 

我试着列出三个不同的电影列表(现在播放,即将到来,流行)。 但它只显示所有三个页面上正在播放列表。

这似乎是从主要活动传递数据到片段不工作的属性,或存储片段参数问题。但是我无法找到导致此问题的原因,也不知道如何解决此问题。

+0

尝试使用viewpager的addOnPageChangeListener在片段更改时加载数据 – AbhayBohra

+0

@MarkKeen将saveInstanceState更改为getArguments()。现在它显示现在播放和流行,但不显示即将到来。我的意思是它显示了应用程序启动时的情况,但是当swipt时,它会覆盖流行列表。 – HyperTiger

回答

1

问题在这里args = savedInstanceState;它应该是args = getArguments(); - 目前在您的switch语句中只有您的默认列表得到遵守。 SavedInstanceState用于配置更改,您需要使用静态Fragment生成器方法添加的Fragment参数。

+0

我将它更改为getArguments()。现在它显示现在播放和流行,但不显示即将到来。我的意思是它显示了应用程序启动时的情况,但是当swipt时,它会覆盖流行列表。 – HyperTiger

0

您还没有为以下片段创建缓存: private final List mFragmentList = new ArrayList <>(); ViewPager已经为你做到了。 尝试在适配器中的方法getItem()内返回片段的相应新实例。

+0

我修改getItem()作为返回NowPlayingFragment.newInstance(position)。 和第一次显示良好。但是当我向下滚动然后回来时。它取代流行。 – HyperTiger

+0

这里是我所说的gif链接[link](http://prntscr.com/ewdq67) – HyperTiger