-1

I have 2 fragments (A and B).I have used a FragmentTabHost in main activity and used these fragments as two different tab. I implemented view pager on fragment A. When I update fragment B I tried to update fragment A also. Which means view pager must be updated.

But after updating B when I switch the tab from B to A, I am unable to get the update in A. After relaunch the app I find the update. But I want the update instantly. I know fragment is tightly coupled with activity. So, I also tried using detach and attach fragment from main activity.

here is my code of fragment A :

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

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    mView = inflater.inflate(R.layout.current_details, container, false);
    init();

    return mView;
}


private void init() {
    session = new SessionManager(getActivity());
    if (session.getCurrentId() < 1) {
        count = 1;
    } else {
        count = AppController.getInstance().getProfile().size();
    }

    mFragmentAdapter = new FragmentAdapter(getChildFragmentManager());
    mViewPager = (ViewPager) mView.findViewById(R.id.pager);
    mViewPager.setAdapter(mFragmentAdapter);

    mViewPager.setCurrentItem(session.getCurrentId());
    Log.d("Status : ","called");
}


public static class FragmentAdapter extends FragmentStatePagerAdapter {

    public FragmentAdapter(FragmentManager fm) {
        super(fm);
        // TODO Auto-generated constructor stub
    }

    @Override
    public Fragment getItem(int arg0) {
        // TODO Auto-generated method stub
        SpecificCurrentDetails fragment = new SpecificCurrentDetails();

        Bundle bdl = new Bundle();
        int id;
        if (AppController.getInstance().getProfile() == null) {
            id = 0;
        } else {
            id = AppController.getInstance().getProfile().get(arg0).getId();
        }
        Log.d("Status ID: ", id + "");
        bdl.putInt("profile_id", id);
        fragment.setArguments(bdl);

        return fragment;
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return count;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object
            object) {
        // TODO Auto-generated method stub
        super.destroyItem(container, position, object);
    }

    @Override
    public int getItemPosition(Object object) {
        return POSITION_NONE;
    }
}

from the code when I switch the tab. I get the log "Status : called" but not getting "Status id: " to be called. When I restart the app then get "Status id : x" called.

I am not getting the point where is the problem though I found onCreateView() is called everytime I switch the tab. I have googled a lot but not yet get any satisfied answers.

Mauker
  • 11,237
  • 7
  • 58
  • 76
Patriotic
  • 2,103
  • 4
  • 26
  • 36

3 Answers3

0

did you call notifyDataSetChanged whenever you want to update your view?

MinFu
  • 353
  • 1
  • 13
0

By default, getItemPosition() returns POSITION_UNCHANGED, which means, "This object is fine where it is, don't destroy or remove it." Returning POSITION_NONE fixes the problem by instead saying, "This object is no longer an item I'm displaying, remove it." So it has the effect of removing and recreating every single item in your adapter.

This is a completely legitimate fix! This fix makes notifyDataSetChanged behave like a regular Adapter without view recycling

if you want to switch out the actual fragments that are being displayed, you need to avoid FragmentPagerAdapter and use FragmentStatePagerAdapter.

check this link update viewpager

Community
  • 1
  • 1
Amit Vaghela
  • 22,772
  • 22
  • 86
  • 142
0

I have solved By Using a Override method.

  @Override
    public Parcelable saveState() {
        return null;
    }
Patriotic
  • 2,103
  • 4
  • 26
  • 36