我想在 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/