Estoy haciendo una aplicación para Android con viewpager y fragmentos. Quiero hacer una opción para agregar o eliminar páginas de fragmento al buscapersonas dinámicamente. Tengo un encargo FragmentPagerAdapter:inserte y elimine fragmentos en viewpager correctamente
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;
}
}
puedo eliminar cualquier fragmento, excepto el 0. cuando intento para sacarlo Tengo una NullPointerException en el notifyDataSetChanged(); o en el pager.setAdapter (esto); si comento el notificar
También recibí una NullPointerException cuando intento insertar una nueva página. Cuando agrego la nueva página al final de la lista, funciona bien. Incluso intenté readd los fragmentos en el relleno con este después de la 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();
}
}
si uso getFragmentTag(i-1)
I consiguieron NullPointer de nuevo. Con solo usar i
obtuve una excepción de estado ilegal porque no puedo modificar la etiqueta del fragmento. Con beginTransaction().add(pager.getId,fragments.get(i).toFragment())
sigue siendo nullpointer ...
Mi pregunta es: ¿qué estoy haciendo mal y cómo se puede hacer correctamente? (y quizás: ¿de dónde obtiene notyfyDataSetChanged()
los datos cuando causa nullpointerexception?)
No se recomienda el enlace. –