私はビューページとフラグメントでアイドロアプリケーションを作っています。フラグメントページをページャに動的に追加または削除するオプションを作成したいと思います。私は、カスタム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;
}
}
私はnotifyDataSetChanged(上のNullPointerExceptionを得、それを削除しようとすると、私は0以外の任意の断片を削除することができます)。またはpager.setAdapter(this);私が通知をコメントアウトする場合。
新しいページを挿入しようとすると、NullPointerExceptionも発生します。新しいページをリストの最後に追加すると、うまくいきます。私はgetFragmentTag(i-1)
を使用している場合 私も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();
}
}
私がnullpointer再び得ました。 i
を使用すると、フラグメントのタグを変更できないため、不正な例外が発生しました。 beginTransaction().add(pager.getId,fragments.get(i).toFragment())
で、それはまだnullpointerです...
私の質問は何ですか:私は間違っていますか、それは適切に行うことができますか? (そして、おそらく:notyfyDataSetChanged()
が原因でnullpointerexceptionが発生する場合は、データを取得しますか?
リンクのみの回答はおすすめしません。 –