7

Sé que ya hay algunos temas sobre esto, pero no pude encontrar una solución que me permitiera trabajar en mi caso.Cómo eliminar el fragmento de FragmentPagerAdapter?

Tengo una galería deslizante que funciona usando un FragmentActivity personalizado y FragmentPagerAdapter que contiene una lista de Fragmentos.

Dentro del FragmentActivity es un ImageView "eliminar". Si se hace clic, se llama a la función deleteMedia(), que luego debe eliminar la actual Fragment y debe aparecer la siguiente Fragment. ¿Cómo tendría que hacer eso en mi ejemplo?

FragmentActivity:

public class GalleryPagerActivity extends FragmentActivity implements OnClickListener { 

    private Intent intent; 
    private SharedPreferences settings; 
    private PagerAdapter mPagerAdapter; 
    private ViewPager mPager; 
    private List<Fragment> fragments; 
    private List<WhiteboardMedia> wiList; 

    private int selectedPosition; 
    private LinearLayout llTop; 
    private TextView tvTop; 
    private ImageView delete; 
    private ImageView share; 
    private TextView tvCounter; 
    private TextView tvFilename; 
    private TextView tvFilesize; 
    private TextView tvDate; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     try { 
      super.setContentView(R.layout.gallery_pager); 

      intent = getIntent(); 

      Type collectionType = new TypeToken<List<WhiteboardMedia>>(){}.getType(); 

      wiList = gson.fromJson(intent.getStringExtra("wiList"), collectionType); 
      selectedPosition = intent.getIntExtra("position", 1); 

      llTop = (LinearLayout) findViewById(R.id.llTop); 
      llTop.setOnClickListener(this); 
      tvTop = (TextView) findViewById(R.id.tvTop); 
      tvTop.setOnClickListener(this); 
      delete = (ImageView) findViewById(R.id.imgDelete); 
      delete.setOnClickListener(this); 
      share = (ImageView) findViewById(R.id.imgShare); 
      share.setOnClickListener(this); 

      tvCounter = (TextView) findViewById(R.id.tvCounter); 
      tvFilename = (TextView) findViewById(R.id.tvFilename); 
      tvFilesize = (TextView) findViewById(R.id.tvFilesize); 
      tvDate = (TextView) findViewById(R.id.tvDate); 

      createContextMenu(); 
      initDropbox(); 
     } catch (Exception e) { 
      Log.e("GalleryPagerActivity", e.getLocalizedMessage()); 
     } 
    } 

    /** 
    * Initialise the pager 
    */ 
    private void initialisePager() { 
     mPager = (ViewPager) super.findViewById(R.id.viewpager); 
     mPager.setAdapter(this.mPagerAdapter); 
     mPager.setOnPageChangeListener(new GalleryPageListener(tvCounter, tvFilename, tvFilesize, tvDate, wiList)); 

     mPager.setCurrentItem(selectedPosition, true); 
     updatePage(selectedPosition); 
    } 

    public void updatePage(int position) 
    { 
     int focusedPage = position + 1; 
     Log.i("onPageSelected", "page selected " + position); 

     WhiteboardMedia wiImage = wiList.get(position); 

     String imageDate = "N/A"; 
     try { 
      Date dateTaken= new Date(); //wiImage.getDate(); 
      SimpleDateFormat sdf = new SimpleDateFormat("yy/MM/dd"); 
      imageDate = sdf.format(dateTaken); 
     } catch (Exception e) { 
     } 

     try { 
      tvCounter.setText(focusedPage + "/" + wiList.size()); 
      tvFilename.setText(wiImage.getFilename()); 
      tvFilesize.setText(wiImage.getSize() + "a"); 
      tvDate.setText(imageDate); 
     } catch (Exception e) { 
     } 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
    } 

    private WhiteboardMedia getActiveWhiteboardImage() { 
     return wiList.get(mPager.getCurrentItem()); 
    } 

    private final int DELETE = 1; 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     menu.add(1, DELETE, 2, R.string.delete).setIcon(R.drawable.menu_btn_trash); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
     case DELETE: 
      deleteMedia(); 
      return true; 
     } 
     return super.onContextItemSelected(item); 
    } 

    @Override 
    public void onClick(View v) { 
     if (v == delete) { 
      deleteMedia(); 
     } 
    } 

    private void deleteMedia() { 
     // TODO delete the active Fragment and display the next Fragment in the list 
    } 

    /****************************************************************************** 
    * Context Menu 
    *****************************************************************************/ 
    private void createContextMenu() { 
     // context menu stuff 
    } 

    @Override 
    protected Dialog onCreateDialog(int id) { 
     // stuff 
    } 

} 

FragmentPagerAdapter:

public class GalleryPagerAdapter extends FragmentPagerAdapter { 

private final List<Fragment> fragments; 

public GalleryPagerAdapter(FragmentManager fm, List<Fragment> fragments) { 
    super(fm); 
    this.fragments = fragments; 
} 

@Override 
public Fragment getItem(int position) { 
    return this.fragments.get(position); 
} 

@Override 
public int getCount() { 
    return this.fragments.size(); 
} 
} 

Gracias por la ayuda!

Respuesta

11

En primer lugar, sugiero que considere la posibilidad de alterar su FragmentPagerAdapter, para que se parezca más a the sample. Normalmente no tiene una lista de fragmentos, de la misma manera que un ArrayAdapter normalmente contiene una lista de Views para las filas. Normalmente, creas los fragmentos bajo demanda y alguien más tiene la lista.

Luego, para eliminar algo, elimínelo de los datos de su modelo (lo que el FragmentPagerAdapter normalmente envuelve). Asegúrese de que getCount() devuelva la cantidad correcta de elementos. Luego, llame al notifyDataSetChanged() en el FragmentPagerAdapter, que debe desencadenar un redibujado del ViewPager.

+0

OK gracias hasta ahora! Tratando de obtener mi código como en el ejemplo. En mi código voy a través de una Lista de Objetos y llevo la Lista de Fragmentos con los Fragmentos apropiados (Imagen, Audio, Video). 'for (int i = 0; i

+1

@ user753827: 'getItem()' necesitaría tener la inteligencia para devolver el fragmento correcto. – CommonsWare

+2

Ugh, he tenido el mismo problema por años. Los fragmentos no se recogen y permanecen allí visualmente (en su posición anterior e incorrecta) hasta que me desplazo demasiado a la derecha/izquierda y el sistema los recupera y vuelve a sincronizar. ¿Alguna idea de lo que estoy haciendo mal? Mi código se parece mucho al ejemplo. –

15

que es la solución que estoy usando:

mViewPager: es la vista que se está utilizando para establecer que Fragmento

mViewPager = (YourViewPager) findViewById(R.id.myPager); 

TABLA: es sólo una lista de números enteros de la posición de todos mis fragmentos

public void destroyAllItem() { 
     int mPosition = mViewPager.getCurrentItem(); 
     int mPositionMax = mViewPager.getCurrentItem()+1; 
     if (TABLE.size() > 0 && mPosition < TABLE.size()) { 
      if (mPosition > 0) { 
       mPosition--; 
      } 

      for (int i = mPosition; i < mPositionMax; i++) { 
       try { 
        Object objectobject = this.instantiateItem(mViewPager, TABLE.get(i).intValue()); 
        if (objectobject != null) 
         destroyItem(mViewPager, TABLE.get(i).intValue(), objectobject); 
       } catch (Exception e) { 
        Log.i(TAG, "no more Fragment in FragmentPagerAdapter"); 
       } 
      } 
     } 
    } 

    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
     super.destroyItem(container, position, object); 

     if (position <= getCount()) { 
      FragmentManager manager = ((Fragment) object).getFragmentManager(); 
      FragmentTransaction trans = manager.beginTransaction(); 
      trans.remove((Fragment) object); 
      trans.commit(); 
     } 
    } 
+0

Esto funciona para mí, gracias! –

+0

Perfecto Douarbou! Gracias ! – anthony

+0

¡Funciona como el encanto! Ahorró mi tiempo! Gracias :) –

1

he encontrado una solución ovverriding el método de "onPostResume()" de la actividad y de llamar a la notifyDataSetChanged dentro de esa.

@Override 
protected void onPostResume() { 
    super.onPostResume(); 
    if(this.mCustomPagerAdapter!=null){ 
     this.mCustomPagerAdapter.notifyDataSetChanged(); 
    } 
} 
Cuestiones relacionadas