Cómo quitar el fragmento de FragmentPagerAdapter?

Sé que hay algunos temas sobre esto aquí ya, pero no pude encontrar una solución que podría llegar a trabajar para mi caso.

Tengo una galería móvil de trabajo usando una FragmentActivity personalizada y FragmentPagerAdapter que contiene una lista de Fragmentos.

Dentro de la FragmentActivity hay un ImageView "delete". Si se hace clic en la función deleteMedia () se llama que entonces debe quitar el Fragmento actual y el fragmento siguiente debe ser mostrado. ¿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!

En primer lugar, sugiero que considere alterar su FragmentPagerAdapter , para que se parezca más a la muestra . Normalmente no tiene una lista de fragmentos, como tampoco un ArrayAdapter normalmente contiene una lista de Views para las filas. Normalmente, crear los fragmentos a petición, y alguien más tiene la lista.

A continuación, para eliminar algo, elimínelo de los datos de su modelo (lo que el FragmentPagerAdapter normalmente envuelve). Asegúrese de que getCount() devolverá el número correcto de elementos. A continuación, llame a notifyDataSetChanged() en el FragmentPagerAdapter , que debería desencadenar un nuevo ViewPager del ViewPager .

Que es la solución que estoy usando:

MViewPager: es la vista que está utilizando para establecer Fragmento

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

TABLA: es sólo una lista entero 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(); } } 

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

 @Override protected void onPostResume() { super.onPostResume(); if(this.mCustomPagerAdapter!=null){ this.mCustomPagerAdapter.notifyDataSetChanged(); } } 
  • Actualizar imágenes en FragmentStatePagerAdapter al reanudar la actividad
  • Cómo actualizar dinámicamente el elemento TITLE del visor de vistas
  • FragmentPagerAdapter dentro de Fragment
  • Añadir pestañas a la izquierda con FragmentPagerAdapter
  • Cargando el fragmento Google Maps de Google Maps administrado por ViewPager
  • Implementar la función como la aplicación de iOS que cierra vertical Desplazar-para-Descartar con ViewPager
  • Java.lang.InstantiationException: no se puede instanciar clase ... sin constructor vacío
  • IllegalStateException: No se puede cambiar la etiqueta del fragmento era android: switcher ahora android: switcher
  • ¿Cómo puedo pasar una variable a través de FragmentPagerAdapter a un fragmento?
  • GetItem (int) para devolver Listfragment en FragmentPagerAdapter
  • Navegación de nuevo a FragmentPagerAdapter -> fragmentos están vacíos
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.