Android ViewPager添加了新的View

时间:2012-06-22 09:40:54

标签: android android-viewpager

我想在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)时,该项目不会预先添加到片段列表中。 (它甚至没有附加)。

有什么想法吗?

2 个答案:

答案 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时,您将遇到其他问题。这些问题将出现在“片段已经添加”中。