在viewPager中使用一个具有不同数据的片段并不起作用

时间:2017-04-14 11:54:27

标签: android android-fragments android-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;
}

我尝试列出三个不同的电影列表(现在播放,即将推出,热门)。 但它只显示现在所有三页的播放列表。

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

您没有为片段制作缓存,例如:     private final List mFragmentList = new ArrayList&lt;&gt;(); ViewPager已经为您完成了。 尝试在适配器中的方法getItem()内返回相应的新片段实例。