Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 7401149
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 29, 20262026-05-29T04:23:30+00:00 2026-05-29T04:23:30+00:00

(If someone needs more information, or a better description let me know) Hello i

  • 0

(If someone needs more information, or a better description let me know)

Hello i included the viewPagerLibrary from here: http://viewpagerindicator.com/#introduction today in my project.

No i get a really strange problem:
If i add a site or page (let’s call it site in the next few lines) and remove it again everything is ok. But if i try to add a different page (Those pages are different Fragements which implements a BaseFragment class) the content of the first page is shown.
The same thing happens if i add a few pages and delete one inbetween those pages. The page which was after the deleted page shows now the deleted pages content.

An example of this bug:
The problem now is. If i add FragmentA after that FragmentB, then i delete FragmentA, FragmentB gets the view/content of FragmentA. The strange thing is, the object is the correct one (So the adapter return the correct object) and the Title is also the correct one.

In my main i create my Pager, Indicator and Adapter this way:

    Cfg.mAdapter = new FragmentAdapter(getSupportFragmentManager());

    Cfg.mPager = (ViewPager)findViewById(R.id.pager);
    Cfg.mPager.setAdapter(Cfg.mAdapter);

    Cfg.mIndicator = (TabPageIndicator)findViewById(R.id.indicator);
    Cfg.mIndicator.setViewPager(Cfg.mPager);

    //We set this on the indicator, NOT the pager
    Cfg.mIndicator.setOnPageChangeListener(TabHelper.onPageChangeListener);

(The Cfg is a static file to store those things for the usage)

My BaseFragment looks like the following:

public class BaseFragment extends Fragment{

    public static int FILE_FRAGMENT = 0;
    public static int FTP_FRAGMENT = 1;
    public static int ADDFTP_FRAGMENT = 2;
    public static int PREVIEW_FRAGMENT = 3;
    public static int CSS_FRAGMENT = 4;
    public static int BOOKS_FRAGMENT = 5;
    public static int SNIPPETS_FRAGMENT = 6;

    //private int id;
    private int typ;
    private String title;

    public int getTyp() {
        return typ;
    }

    public void setTyp(int typ) {
        this.typ = typ;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}

One of the Fragments looks like this (I think the other fragments make no difference):

public class FtpFragment extends BaseFragment {
    private static RowLayout rowLayout_view;

    public FtpFragment() {
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        init_data();
    }

    public static void init_data()
    {
        //Remove child for update
        rowLayout_view.removeAllViews();

        List<FtpData> ftps = FtpStorage.getInstance().getFtps();

        if (ftps != null) {
            for (FtpData f : ftps) {
                View inflatedView;
                inflatedView = View.inflate(Cfg.ctx, R.layout.ftp, null);
                inflatedView.setOnClickListener(button_ftp_listener);
                inflatedView.setOnLongClickListener(button_ftp_longClickListener);
                inflatedView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, Converter.convertFromDPtoPixel(160.0f)));
                inflatedView.setTag(f);
                inflatedView.findViewById(R.id.book_imageview).setBackgroundDrawable(
                                Cfg.ctx.getResources().getDrawable(R.drawable.nopreview));


                ((TextView) inflatedView.findViewById(R.id.book_textview)).setText(f.nickname);

                rowLayout_view.addView(inflatedView);
            }
        }
    }

    @Override

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment_ftp, container, false);
    rowLayout_view = (RowLayout) v.findViewById(R.id.rowLayout_ftps);
    return v;
}

@Override
public String getTitle() {
    return "FTPs";
}

@Override
public int getTyp() {
    return BaseFragment.FTP_FRAGMENT;
}

@Override
public void setTyp(int typ) {
    super.setTyp(typ);
}

}

To remove or add a page i call this:

public static void addNewTab(BaseFragment fragment)
{
    Cfg.mAdapter.addItem(fragment);
    Cfg.mPager.setCurrentItem(Cfg.mAdapter.getCount());
    Cfg.mIndicator.notifyDataSetChanged();
}

public static void deleteActTab()
{
    Cfg.mAdapter.removeItem(Cfg.mAdapter.getActPage());
    Cfg.mIndicator.notifyDataSetChanged();
}

And that’s the adapter:

public class FragmentAdapter extends FragmentPagerAdapter implements TitleProvider{
    public List<BaseFragment> fragments = new LinkedList<BaseFragment>();

    private int actPage;

    public FragmentAdapter(FragmentManager fm) {
        super(fm);
    }


    public void setActPage(int actPage) {
        Lg.d("setActPage: " + actPage + " : " + fragments.get(actPage).toString());
        this.actPage = actPage; 
    }

    public void addItem(BaseFragment fragment)
    {
        Lg.d("addItem: " + fragment.toString());
        fragments.add(fragment);
    }

    public void removeItem(int index)
    {
        if(index < getCount()){
            Lg.d("RemoveItem: " + index + " : " + fragments.get(index).toString());
            fragments.remove(index);
        }
    }

    public BaseFragment getActFragment()
    {
        return getItem(getActPage());
    }

    public int getActPage() {
        return actPage;
    }

    @Override
    public BaseFragment getItem(int position) {
        if(position < getCount())
        {
            Lg.v("getItem: " + fragments.get(position));
            return fragments.get(position);
        }
        else
            return null;
    }

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

    @Override
    public String getTitle(int position) {
        Lg.v("Get Title: " + fragments.get(position).getTitle());
        return fragments.get(position).getTitle();
    }

}

Yeah i hope someone can help me.

If i forgot something let me konw.

Thanks in advance,
Mike

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-29T04:23:31+00:00Added an answer on May 29, 2026 at 4:23 am

    Ok i’ve now solved my problem in a hackish way, but yeah it’s working ;). If someone can improve my solution please let me know. For my new solution i now use a CustomFragmentStatePagerAdapter but it doesn’t save the state like it should and stores all the Fragments in a list. This can cause a memory problem if the user has more than 50 fragments, like the normal FragmentPagerAdapter does. It would be great if someone can add the State-thing back to my solution without removing my fixes. Thanks.

    So here’s my CustomFragmentStatePagerAdapter.java

    package com.tundem.webLab.Adapter;
    
    import java.util.ArrayList;
    
    import android.os.Bundle;
    import android.os.Parcelable;
    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentManager;
    import android.support.v4.app.FragmentTransaction;
    import android.support.v4.view.PagerAdapter;
    import android.util.Log;
    import android.view.View;
    import android.view.ViewGroup;
    
    public abstract class CustomFragmentStatePagerAdapter extends PagerAdapter {
        private static final String TAG = "FragmentStatePagerAdapter";
        private static final boolean DEBUG = false;
    
        private final FragmentManager mFragmentManager;
        private FragmentTransaction mCurTransaction = null;
    
        public ArrayList<Fragment.SavedState> mSavedState = new ArrayList<Fragment.SavedState>();
        public ArrayList<Fragment> mFragments = new ArrayList<Fragment>();
        private Fragment mCurrentPrimaryItem = null;
    
        public CustomFragmentStatePagerAdapter(FragmentManager fm) {
            mFragmentManager = fm;
        }
    
        /**
         * Return the Fragment associated with a specified position.
         */
        public abstract Fragment getItem(int position);
    
        @Override
        public void startUpdate(ViewGroup container) {}
    
        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            // If we already have this item instantiated, there is nothing
            // to do. This can happen when we are restoring the entire pager
            // from its saved state, where the fragment manager has already
            // taken care of restoring the fragments we previously had instantiated.
    
            // DONE Remove of the add process of the old stuff
            /* if (mFragments.size() > position) { Fragment f = mFragments.get(position); if (f != null) { return f; } } */
    
            if (mCurTransaction == null) {
                mCurTransaction = mFragmentManager.beginTransaction();
            }
    
            Fragment fragment = getItem(position);
            if (DEBUG)
                Log.v(TAG, "Adding item #" + position + ": f=" + fragment);
            if (mSavedState.size() > position) {
                Fragment.SavedState fss = mSavedState.get(position);
                if (fss != null) {
                    try // DONE: Try Catch
                    {
                        fragment.setInitialSavedState(fss);
                    } catch (Exception ex) {
                        // Schon aktiv (kA was das heißt xD)
                    }
                }
            }
            while (mFragments.size() <= position) {
                mFragments.add(null);
            }
            fragment.setMenuVisibility(false);
            mFragments.set(position, fragment);
            mCurTransaction.add(container.getId(), fragment);
    
            return fragment;
        }
    
        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            Fragment fragment = (Fragment) object;
    
            if (mCurTransaction == null) {
                mCurTransaction = mFragmentManager.beginTransaction();
            }
            mCurTransaction.remove(fragment);
    
            /*if (mCurTransaction == null) { mCurTransaction = mFragmentManager.beginTransaction(); } if (DEBUG) Log.v(TAG, "Removing item #" + position + ": f=" + object + " v=" + ((Fragment)
             * object).getView()); while (mSavedState.size() <= position) { mSavedState.add(null); } mSavedState.set(position, mFragmentManager.saveFragmentInstanceState(fragment));
             * mFragments.set(position, null); mCurTransaction.remove(fragment); */
        }
    
        @Override
        public void setPrimaryItem(ViewGroup container, int position, Object object) {
            Fragment fragment = (Fragment) object;
            if (fragment != mCurrentPrimaryItem) {
                if (mCurrentPrimaryItem != null) {
                    mCurrentPrimaryItem.setMenuVisibility(false);
                }
                if (fragment != null) {
                    fragment.setMenuVisibility(true);
                }
                mCurrentPrimaryItem = fragment;
            }
        }
    
        @Override
        public void finishUpdate(ViewGroup container) {
            if (mCurTransaction != null) {
                mCurTransaction.commitAllowingStateLoss();
                mCurTransaction = null;
                mFragmentManager.executePendingTransactions();
            }
        }
    
        @Override
        public boolean isViewFromObject(View view, Object object) {
            return ((Fragment) object).getView() == view;
        }
    
        @Override
        public Parcelable saveState() {
            Bundle state = null;
            if (mSavedState.size() > 0) {
                state = new Bundle();
                Fragment.SavedState[] fss = new Fragment.SavedState[mSavedState.size()];
                mSavedState.toArray(fss);
                state.putParcelableArray("states", fss);
            }
            for (int i = 0; i < mFragments.size(); i++) {
                Fragment f = mFragments.get(i);
                if (f != null) {
                    if (state == null) {
                        state = new Bundle();
                    }
                    String key = "f" + i;
                    mFragmentManager.putFragment(state, key, f);
                }
            }
            return state;
        }
    
        @Override
        public void restoreState(Parcelable state, ClassLoader loader) {
            if (state != null) {
                Bundle bundle = (Bundle) state;
                bundle.setClassLoader(loader);
                Parcelable[] fss = bundle.getParcelableArray("states");
                mSavedState.clear();
                mFragments.clear();
                if (fss != null) {
                    for (int i = 0; i < fss.length; i++) {
                        mSavedState.add((Fragment.SavedState) fss[i]);
                    }
                }
                Iterable<String> keys = bundle.keySet();
                for (String key : keys) {
                    if (key.startsWith("f")) {
                        int index = Integer.parseInt(key.substring(1));
                        Fragment f = mFragmentManager.getFragment(bundle, key);
                        if (f != null) {
                            while (mFragments.size() <= index) {
                                mFragments.add(null);
                            }
                            f.setMenuVisibility(false);
                            mFragments.set(index, f);
                        } else {
                            Log.w(TAG, "Bad fragment at key " + key);
                        }
                    }
                }
            }
        }
    }
    

    Here’s my normal FragmentAdapter.java

    package com.tundem.webLab.Adapter;
    
    import java.util.LinkedList;
    import java.util.List;
    
    import android.support.v4.app.FragmentManager;
    
    import com.tundem.webLab.fragments.BaseFragment;
    import com.viewpagerindicator.TitleProvider;
    
    public class FragmentAdapter extends CustomFragmentStatePagerAdapter implements TitleProvider {
        public List<BaseFragment> fragments = new LinkedList<BaseFragment>();
    
        private int actPage;
    
        public FragmentAdapter(FragmentManager fm) {
            super(fm);
        }
    
        public void setActPage(int actPage) {
            this.actPage = actPage;
        }
    
        public void addItem(BaseFragment fragment) {
            // TODO if exists don't open / change to that tab
            fragments.add(fragment);
        }
    
        public BaseFragment getActFragment() {
            return getItem(getActPage());
        }
    
        public int getActPage() {
            return actPage;
        }
    
        @Override
        public BaseFragment getItem(int position) {
            if (position < getCount()) {
                return fragments.get(position);
            } else
                return null;
        }
    
        @Override
        public int getCount() {
            return fragments.size();
        }
    
        @Override
        public String getTitle(int position) {
            return fragments.get(position).getTitle();
        }
    
        @Override
        public int getItemPosition(Object object) {
            return POSITION_NONE;
        }
    }
    

    And this is the way i delete a Fragment. (I know it’s a bit more than only .remove() ). Be free to improve my solution, you can also add this code somewhere in the adapter so yeah. It’s up to the user who tries to implement this. I use this in my TabHelper.java (A class which handles all tab operations like delete, add, …)

        int act = Cfg.mPager.getCurrentItem();
        Cfg.mPager.removeAllViews();
        Cfg.mAdapter.mFragments.remove(act);
        try {
            Cfg.mAdapter.mSavedState.remove(act);
        } catch (Exception ex) {/* Already removed */}
        try {
            Cfg.mAdapter.fragments.remove(act);
        } catch (Exception ex) {/* Already removed */}
    
        Cfg.mAdapter.notifyDataSetChanged();
        Cfg.mIndicator.notifyDataSetChanged();
    

    Description of the Cfg. thing. I save the reference to those objects in a cfg, class so i can always use them without the need of a special Factory.java …

    Yeah. i hope i was able to help. Feel free to improve this, but let me know so i can improve my code too.

    Thanks.

    If i missed any code let me know.


    My old answer also works but only if you have different Fragments. FileFragment, WebFragment, … Not if you use one of those fragmenttypes twice.

    I got it pseudo working for now. It’s a really dirty solution and i’m still searching for a better one. Please help.

    I changed the code, where i delete a tab to this one:

       public static void deleteActTab()
            {   
                //We set this on the indicator, NOT the pager
                int act = Cfg.mPager.getCurrentItem();
                Cfg.mAdapter.removeItem(act);
                List<BaseFragment> frags = new LinkedList<BaseFragment>();
                frags = Cfg.mAdapter.fragments;
    
                Cfg.mPager = (ViewPager)Cfg.act.findViewById(R.id.pager);
                Cfg.mPager.setAdapter(Cfg.mAdapter);
                Cfg.mIndicator.setViewPager(Cfg.mPager);
    
                Cfg.mAdapter.fragments = frags;
    
                if(act > 0)
                {
                    Cfg.mPager.setCurrentItem(act-1);
                    Cfg.mIndicator.setCurrentItem(act-1);
                }
    
                Cfg.mIndicator.notifyDataSetChanged();
            }
    

    If someone can improve this code let me know. If someone can tell us the real answer for that problem. please add it here. There are many many people who experience this issue. I added a reputation of 50 for the one who solve it. I can also give a donation for the one who solve it.

    Thanks

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

actually I need a little more information about how to read response from HttpUrlConnection
Sometimes one needs to dig into someone else's code, understand it and maybe refactor/fix
I need someone to explain to me where this extra padding is coming from
I need the advice from someone who knows Java very well and the memory
I need a php code and sql code that will let someone upload an
I need someone to back me up, or prove me wrong, in regard to
I need someone to explain the following names; Asynchronous Delegates. Asynchronous methods. Asynchronous events.
Or they (team members) need someone to keep pushing? Edit: The above line was
I was playing with shell scripting, when a strange thing happened. I need someone
I need to create a script where someone will post an opening for a

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.