Android Fragment接收Bundle值为null ViewPager总打开首页如何解决
问题根因
你的核心问题有2个:
- ArticleActivity拿到RecyclerView传入的点击position后,仅把值传给了PagerAdapter,但没有主动设置ViewPager的当前选中项,ViewPager默认始终展示第0页,这是你始终看到第一页的核心原因。
- ScreenSlidePagerAdapter存在冗余硬编码逻辑,部分场景下会导致索引越界、参数匹配错误。
具体修改步骤
1. 修改ArticleActivity的setUpPager方法
给ViewPager主动设置选中的position,代码如下:
private void setUpPager(){ PagerAdapter pagerAdapter=new ScreenSlidePagerAdapter(getSupportFragmentManager(), FragmentStatePagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT, newsList); viewPager.setAdapter(pagerAdapter); // 新增这行,设置ViewPager默认展示点击的对应页面,第二个参数false表示不需要滚动动画 viewPager.setCurrentItem(position, false); }
2. 重构ScreenSlidePagerAdapter,删除冗余硬编码
你现有代码里的switch分支完全没必要,硬编码10页也容易和实际接口返回的数据量不匹配,修改后代码如下:
public class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter { private NewsList newsList; public ScreenSlidePagerAdapter(FragmentManager fragmentManager, int behavior, NewsList newsList){ super(fragmentManager, behavior); this.newsList = newsList; } public Fragment getItem(int position) { // 直接创建对应position的Fragment即可,不需要冗余判断 return ArticleFragment.newInstance(newsList, position); } @Override public int getCount() { // 动态取实际数据的长度,不要硬编码10 return newsList.getNewsList().size(); } }
3. 补充序列化检查
确认你的NewsList类和内部持有的News类都实现了Serializable接口,否则跨页面传参时会出现序列化失败,导致Bundle拿到的参数为空。
4. 可选优化(增加容错逻辑)
在ArticleFragment的onCreate里增加参数异常的容错判断,避免崩溃:
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { mNewsList = (NewsList) getArguments().getSerializable(ARG_PARAM1); mPosition = getArguments().getInt(ARG_PARAM2, -1); // 如果参数异常直接返回,避免后续索引越界 if(mNewsList == null || mPosition <0 || mPosition >= mNewsList.getNewsList().size()){ return; } } }
修改完成后重新运行即可解决点击任意条目始终打开第一页的问题。
内容的提问来源于stack exchange,提问作者navi1111
相关产品推荐
相关产品推荐

