How to Remove Fragment from FragmentPagerAdapter?
android, android-fragmentactivity, android-fragments, fragmentpageradapter
Solution
First, I suggest that you consider altering your `FragmentPagerAdapter`, to look more like the sample. You normally do not hold a list of fragments, any more than an `ArrayAdapter` normally holds a list of `Views` for the rows. Normally, you create the fragments on demand, and somebody else holds the list.
Then, to delete something, delete it from your model data (what the `FragmentPagerAdapter` normally wraps). Make sure that `getCount()` will then return the right number of items. Then, call `notifyDataSetChanged()` on the `FragmentPagerAdapter`, which should trigger a redraw of the `ViewPager`.
Problem
I know there are some topics about this here already but I could not find a solution which I could get to work for my case. I have a working sliding gallery using a custom `FragmentActivity` and `FragmentPagerAdapter` which holds a list of Fragments. Within the `FragmentActivity` is a `ImageView` "delete". If clicked, the function `deleteMedia()` is called which then should remove the current `Fragment` and the following `Fragment` should be displayed. How would I have to do that in my example? 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(); } } ``` Thanks for help!