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.
- mantener instancias de fragmentos dentro de FragmentPagerAdapter
- ¿Cuándo se llama a getItem de FragmentPagerAdapter?
- Eliminar Elemento + Desplazarse a Siguiente en Android ViewPager
- Android: limitar los fragmentos de carga con una viewPager
- Haga clic en la pestaña de Android
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!
- Desplazamiento no funciona en android ViewPager con FragmentPagerAdapter
- Fragmento en ViewPager, no se puede obtener la instancia de fragmento actual
- Reordenar páginas en FragmentStatePagerAdapter usando getItemPosition (objeto objeto)
- ViewPager con FragmentPagerAdapter no se muestra
- Reemplazar ViewPager con Fragmento - y luego volver a navegar
- FragmentPagerAdapter y FragmentStatePagerAdapter
- ViewPager + FragmentPagerAdapter dentro de un DialogFragment obtiene "IllegalArgumentException: No se encontró ninguna vista ..."
- Actualizando viewpager con fragmentos en un nuevo orden
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(); } }