Я делаю приложение для 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. когда я пытаюсь удалить его, я получаю NullPointerException на notifyDataSetChanged(); или на странице pager.setAdapter(this); если я закомментирую уведомление.
Я также получил исключение NullPointerException, когда пытаюсь вставить новую страницу. Когда я добавляю новую страницу в конец списка, она работает нормально. Я даже пытался читать фрагменты во вставке с этим после фрагментов.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()
брать данные, когда вызывает исключение nullpointerexception?)