我想在ViewPager的第一页前添加一个新视图。 我的适配器看起来像这样:
public class PagerAdapter extends FragmentPagerAdapter {
private final List<Fragment> fragments;
public PagerAdapter(FragmentManager fm, List<Fragment> fragments) {
super(fm);
this.fragments = fragments;
}
@Override
public Fragment getItem(int index) {
return fragments.get(index);
}
@Override
public int getCount() {
return fragments.size();
}
public void add(int i, ImageFileObject imageFile) {
ImageViewFragment f = new ImageViewFragment();
f.setImage(imageFile);
fragments.add(0, f);
notifyDataSetChanged();
}
public void add(ImageFileObject imageFile) {
ImageViewFragment f = new ImageViewFragment();
f.setImage(imageFile);
fragments.add(f);
notifyDataSetChanged();
}
}
但是当调用add(0,aImageFile)时,该项目不会预先添加到片段列表中。 (它甚至没有附加)。
有什么想法吗?
答案 0 :(得分:2)
更新:您在评论中描述的问题是真实的,我在第一次测试中错过了它。在分析了FragmentPagerAdapter
的源代码之后,我意识到我们需要做的就是覆盖getItemId()
,使其不会为不同的片段项返回相同的ID。例如。当前的默认实现只会返回位置作为片段的id,这对于这种情况不起作用:
public long getItemId(int position) {
return position;
}
我正在更新此答案,请看一下。和以前一样,我测试了这段代码,你所描述的问题现在还没有发生。
只有不才能在List
中自行引用片段,FragmentPagerAdapter
为您完成此操作。据我所知,这也不是一个好习惯。而且,即使您按照其他答案的建议从POSITION_NONE
返回getItemPosition()
,您最终也会遇到异常
引起:java.lang.IllegalStateException:无法更改片段的标记。
这是因为您尝试通过在第0个索引处添加片段(导致其他片段重新定位)来重新定位Fragment
中的List
个活动ViewPager
,并public class PagerAdapter extends FragmentPagerAdapter {
public static class FragmentInfo {
public String classz;
public ImageFileObject imageFile;
public static long IDS;
public long id;
public FragmentInfo(){
id = IDS++;
}
}
private final List<FragmentInfo> fragments;
private Context context;
public PagerAdapter(FragmentManager fm, List<FragmentInfo> fragments,
Context context) {
super(fm);
this.fragments = fragments;
this.context = context;
}
@Override
public Fragment getItem(int index) {
FragmentInfo info = fragments.get(index);
ImageViewFragment frag = (ImageViewFragment) Fragment.instantiate(
context, info.classz, /* null arguments*/ null);
frag.setImage(info.imageFile);
return frag;
}
@Override
public long getItemId(int position) {
return fragments.get(position).id;
}
@Override
public int getCount() {
return fragments.size();
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
public void add() {
FragmentInfo f = new FragmentInfo();
f.classz = ImageViewFragment.class.getName();
fragments.add(0, f);
notifyDataSetChanged();
}
}
根据标签重新分配标签位置。
记住这一切,这是一个经过测试且工作修改后的适配器:
{{1}}
请相应更改您的代码。
答案 1 :(得分:0)
问题实际上是notifyDataSetChanged。只需添加到您的适配器:
public int getItemPosition(Object object) {
return POSITION_NONE;
}
但是,我认为当适配器实际尝试再次调用getItem
时,您将遇到其他问题。这些问题将出现在“片段已经添加”中。