Android ViewPager 前置新 View

标签 android android-viewpager

我想在 ViewPager 的首页添加一个新 View 。 我的适配器如下所示:

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) 时,该项目不会添加到 fragment 列表中。 (它甚至没有附加)。

有什么想法吗?

最佳答案

更新:您在评论中描述的问题是真实的,我在第一次测试中错过了它。在分析了 FragmentPagerAdapter 的源代码后,我意识到我们需要做的就是以一种不会出现的方式重写 getItemId()为不同的 fragment 项返回相同的 id。例如。当前的默认实现只会返回位置作为 fragment 的 id,这不适用于这种情况:

 public long getItemId(int position) {
    return position;
}

我正在更新这个答案,请查看。和以前一样,我测试了这段代码,您描述的问题现在没有发生。


您唯一需要的是不需要List中自己保留 fragment 的引用,这是由FragmentPagerAdapter为您完成的。据我所知,这也不是一个好的做法。而且即使您按照其他答案的建议从 getItemPosition() 返回 POSITION_NONE ,您最终也会遇到异常

Caused by: java.lang.IllegalStateException: Can't change tag of fragment.

这是因为您尝试通过在第 0 个索引处添加 fragment (这会导致其他 fragment 重新定位)来重新定位 List 中 Activity 的 Fragment,并且 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();
}
}

请相应地更改您的代码。

关于Android ViewPager 前置新 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11153771/

相关文章:

android - 从导航的深层链接调用我的应用程序会导致我的 fragment 被多次实例化

android - CoordinatorLayout 与 RecyclerView

java - Android - 显示 fragment 的问题

android - IllegalStateException:在 ViewPager 的 onSaveInstanceState 之后无法执行此操作

android - 在 PagerAdapter 中实现循环滚动

android - 无法将类型 'Android.Support.V4.App.Fragment' 转换为 'Android.Gms.Maps.MapFragment'

java - 无法找到签名中引用的类(Landroid/sec/multiwindow/MultiWindow;)

android - 无法使用 10.2.0 解析 PlaceAutocompleteFragment

android - 保存 WebView 的状态并在 ANDROID 中恢复

android - 使用 fragment 查看寻呼机 - 显示 onStart 对话框