我正在制作一个带有 viewpager 和片段的 android 应用程序。我想选择动态向寻呼机添加或删除片段页面。我有一个自定义 FragmentPagerAdapter:
public class MyAdapter extends FragmentPagerAdapter implements TitleProvider{
protected final List<PageFragment> fragments;
/**
* @param fm
* @param fragments
*/
public MyAdapter(FragmentManager fm, List<PageFragment> fragments) {
super(fm);
this.fragments = fragments;
}
public void addItem(PageFragment f){
fragments.add(f);
notifyDataSetChanged();
}
public void addItem(int pos, PageFragment f){
for(int i=0;i<fragments.size();i++){
if(i>=pos){
getSupportFragmentManager().beginTransaction().remove(getSupportFragmentManager().findFragmentByTag(getFragmentTag(i))).commit();
}
}
fragments.add(pos,f);
notifyDataSetChanged();
pager.setAdapter(this);
pager.setCurrentItem(pos);
}
public void removeItem(int pos){
getSupportFragmentManager().beginTransaction().remove(getSupportFragmentManager().findFragmentByTag(getFragmentTag(pos))).commit();
for(int i=0;i<fragments.size();i++){
if(i>pos){
getSupportFragmentManager().beginTransaction().remove(getSupportFragmentManager().findFragmentByTag(getFragmentTag(i))).commit();
}
}
fragments.remove(pos);
notifyDataSetChanged();
pager.setAdapter(this);
if(pos<fragments.size()){
pager.setCurrentItem(pos);
}else{
pager.setCurrentItem(pos-1);
}
}
@Override
public Fragment getItem(int position) {
return fragments.get(position).toFragment();
}
@Override
public int getCount() {
return fragments.size();
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
private String getFragmentTag(int pos){
return "android:switcher:"+R.id.pager+":"+pos;
}
public String getTitle(int position) {
String name = fragments.get(position).getName();
if(name.equals(""))
return "- "+position+" -";
return name;
}
}
我可以删除除 0 之外的任何片段。当我尝试删除它时,我在 notifyDataSetChanged(); 上得到了 NullPointerException;或在 pager.setAdapter(this); 如果我注释掉通知。
当我尝试插入新页面时,我也得到了 NullPointerException。当我将新页面添加到列表末尾时,它工作正常。我什至尝试在 Fragments.add(pos,f) 之后用这个来读取插入中的片段
for(int i=0;i<fragments.size();i++){
if(i>=pos){
getSupportFragmentManager().beginTransaction().add(fragments.get(i).toFragment(),getFragmentTag(i-1)).commit();
}
}
如果我使用getFragmentTag(i-1)
我又得到了空指针。使用只是i
我得到了非法状态异常,因为无法修改片段的标签。有了beginTransaction().add(pager.getId,fragments.get(i).toFragment())
它仍然是空指针......
我的问题是:我做错了什么,如何才能正确完成?(也许:notyfyDataSetChanged()
当导致空指针异常时从哪里获取数据?)