java – FragmentPagerAdapter在第一页上显示所有片段内容
作者:互联网
在内存中,我有一个Items列表,每个都有一个标题和一个0..N Chunks列表(存储一些信息).我知道我正在内存中正确创建此列表,因为我已将整个结构输出到命令行.
我有一个使用ViewPager显示此数据的活动. ViewPager的每个页面都是一个Item,它填充了Fragment,其中包含Item的每个Chunk的信息.
我目前编码的方式,前两个项目的块显示在第一个项目下的第一页上.当页面滚动到第二页时,它是空的.当页面滚动到第3页(我现在只有3个项目列表供测试)时,它也会显示一个空白页面,但是当页面返回到第2页面时,它会显示第1个项目的块.然后,每次导航到第一页然后第二页时,第三页的块被新添加到现有列表中.如果存在从第2页到第3页以及后退的导航,则第1项中的块将新添加到列表中.这可以通过不断增长的列表令人作呕来完成.我不知道为什么它表现不正常.
这是我的主要活动(包括FragmentPagerAdapter):
public class MyActivity extends FragmentActivity {
MyPagerAdapter mPagerAdapter;
ViewPager mViewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Controller.setup();
mPagerAdapter = new MyPagerAdapter(getSupportFragmentManager());
mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setAdapter(mPagerAdapter);
}
public class MyPagerAdapter extends FragmentPagerAdapter {
public MyPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
Fragment fragment = new MyFragment();
Bundle args = new Bundle();
args.putInt(MyFragment.POSITION, position);
fragment.setArguments(args);
return fragment;
}
@Override
public int getCount(){
return Controller.getAmount();
}
@Override
public CharSequence getPageTitle(int position) {
return Controller.getItem(position).getTitle();
}
}
}
Controller非常简单,可以像您期望的那样返回信息. Controller.setup()只创建Items列表.
这是我的Item片段:
public class MyFragment extends Fragment {
public final static String POSITION = "position";
private int pos;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
pos = getArguments().getInt(POSITION);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_item, container, false);
Item item = Controller.getItem(pos);
Iterator<Chunk> chunks = item.getChunks().iterator();
FragmentManager manager = getFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
while(chunks.hasNext()){
Chunk chunk = chunks.next();
ChunkFragment entry = new ChunkFragment();
Bundle args = new Bundle();
args.putString(ChunkFragment.INFO_ARG, chunk.getInfo());
entry.setArguments(args);
transaction.add(R.id.container, entry);
}
transaction.commit();
return rootView;
}
}
最后我的Chunk片段:
public class ChunkFragment extends Fragment {
public static final String INFO_ARG = "Info";
private String mInfo;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
Bundle args = getArguments();
mInfo = args.getString(INFO_ARG);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//setup view
ViewGroup rootView;
rootView = (ViewGroup) inflater.inflate(R.layout.fragment_chunk, container, false);
TextView infoView = (TextView) rootView.findViewById(R.id.info_text);
infoView.setText(mInfo);
return rootView;
}
}
我知道这是很多代码,但我不知道问题出在哪里.我把它简化到最低限度,只包括可能成为问题根源的操作.我还没有包含我的XML布局文件,但它们已经过测试并且工作正常.
解决方法:
我不确定这一点,但我相信你的问题可能与在ViewPager中片段中实例化片段的困难有关.
您可以考虑取消将其视为可能性by following the guidelines for nesting fragments之一:这实际上归结为在片段中使用getChildFragmentManager(),您要在其中添加片段.
此外,您可能需要考虑扩展FragmentStatePagerAdapter,它更好地维护它们的销毁和重新创建之间的片段状态.
标签:java,android,android-fragments,android-viewpager,fragmentpageradapter 来源: https://codeday.me/bug/20190629/1328020.html