问题描述
- 我有一个 ViewPager,一个扩展 FragmentPagerAdapter 的 FragmentAdapter,以及一个扩展 Fragment 的 NewsFragment 的 ArrayList。问题是,当我动态编辑 FragmentList 时,我的 tabLayout 和 FragmentList 包含正确的数据,但 viewPager 没有显示正确的 Fragment。
- 例如,首先,我进入 fragment3,然后在编辑活动中将 fragment3 替换为 fragment#。之后我回到 mainActivity 并发生了坏事。当我进入应该显示片段#的第三个片段时,它实际上显示的是我第一次进入它时实例化的片段3。
- 我认为问题可能是由于活动管理片段的方式,也许片段存储在由片段管理器或其他控制的集合中。有什么难过的。我试图通过一个一个弹出项目来清除fragmentManager,最后问题仍然存在。这是我与问题相关的代码
public class MainActivity extends AppCompatActivity {
String[] categoriesList = {"娱乐", "军事", "教育", "文化", "健康", "财经", "体育", "汽车", "科技", "社会"};
ArrayList<ChannelBean> channelBeans;
ArrayList<ChannelBean> curChannels;
ArrayList<NewsFragment> newsFragments;
TabLayout tagBar;
ViewPager viewPager;
NewsFragment curFragment = null;
Button channelManageBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tagBar = (TabLayout) findViewById(R.id.news_tab_layout);
viewPager = findViewById(R.id.news_view_pager);
channelManageBtn = findViewById(R.id.moreChannelBtn);
newsFragments = new ArrayList<>();
channelBeans = new ArrayList<>();
curChannels = new ArrayList<>();
for (String channel : categoriesList) {
ChannelBean bean = new ChannelBean(channel, true);
channelBeans.add(bean);
curChannels.add(bean);
newsFragments.add(new NewsFragment(channel));
}
viewPager.setAdapter(new FragmentAdapter(getSupportFragmentManager(), newsFragments));
tagBar.setupWithViewPager(viewPager);
channelManageBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ChannelActivity.startChannelActivity(MainActivity.this, channelBeans);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == ChannelActivity.REQUEST_CODE && resultCode == ChannelActivity.RESULT_CODE) {
String jsonStr = data.getStringExtra(ChannelActivity.RESULT_JSON_KEY);
Gson gson = new Gson();
channelBeans = gson.fromJson(jsonStr, new TypeToken<ArrayList<ChannelBean>>(){}.getType());
newsFragments.clear();
curChannels.clear();
for (ChannelBean channel : channelBeans) {
if (channel.isSelect()) {
newsFragments.add(new NewsFragment(channel.getName()));
curChannels.add(channel);
}
}
viewPager.getAdapter().notifyDataSetChanged();
tagBar.setupWithViewPager(viewPager);
}
}
class FragmentAdapter extends FragmentPagerAdapter {
ArrayList<NewsFragment> mNewsFragment;
public FragmentAdapter(FragmentManager fm, ArrayList<NewsFragment> newsFragments) {
super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
mNewsFragment = newsFragments;
}
@NonNull
@Override
public Fragment getItem(int position) {
return mNewsFragment.get(position);
}
@Override
public int getCount() {
return mNewsFragment.size();
}
@Nullable
@Override
public CharSequence getPageTitle(int position) {
return mNewsFragment.get(position).getCategories();
}
@Override
public void setPrimaryItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
curFragment = (NewsFragment) object;
super.setPrimaryItem(container, position, object);
}
}
}
标签: javaandroidandroid-fragmentsandroid-viewpager
解决方案
推荐阅读