ビューページャーとフラグメントを使用して 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 も発生しました。新しいページをリストの最後に追加すると、正常に機能します。fragment.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)
と、再びnullpointerになりました。使用しただけi
では、フラグメントのタグを変更できないため、 illegalstateexception が発生しました。beginTransaction().add(pager.getId,fragments.get(i).toFragment())
それはまだnullpointerです...
私の質問は次のとおりです。何が間違っているのか、どうすれば適切に行うことができますか? (そしておそらく:notyfyDataSetChanged()
nullpointerexceptionが発生したときにどこからデータを取得しますか?)