Reputation: 41119
I have this problem, I have a FragmentActivity
with a ViewPager
and a ViewPagerAdapter
.
In this ViewPager I have 3 Fragments
that each of them contains a TableLayout
that gets populated programmaticly using a 2dArrayList
.
on a click of a button in the FragmentActivity
layout, I filter the data in the 2dArrayList
and basically need to recreate all 3 Fragments
with the new dataset (run the onCreateView
method in all of them).
So I create an onClickListener
for this button:
private class SlicerSelectedOnClickListener implements OnClickListener {
private ODSharedSlicer slicer;
public SlicerSelectedOnClickListener(ODSharedSlicer slicer) {
super();
this.slicer = slicer;
}
public void onClick(View v) {
String slicerValue = ((Button) v).getText().toString();
Log.d(TAG,"Slicer value: "+ slicerValue +" chosen");
application.currentReport.getODSharedSlicers().get(0).getSharedSlicerSelectedMemebers().add(slicerValue);
ViewGroup parent = (ViewGroup) ((Button) v).getParent();
for (int i = 0; i < parent.getChildCount(); i++)
{
if ((parent.getChildAt(i) != v) && (parent.getChildAt(i) instanceof ToggleButton))
{
((ToggleButton) parent.getChildAt(i)).setChecked(false);
}
}
mPagerAdapter.notifyDataSetChanged();
}
}
As you can see I have a mPagerAdapter.notifyDataSetChanged();
As suggested here:
How to recreate fragment with viewpager intentionally?
at the end of this method, So I expect the adapter to recreate all the Fragment
s, but the onCreateView
from any of the fragments never runs.
Can any one suggest what am I doing wrong. any assistance would be appreciated.
Upvotes: 25
Views: 24152
Reputation: 881
for those who still face the same problem which I faced the same problem when I have ViewPager
with seven fragment. the default for these fragments to load the English content from the service but the problem here that I want to change the language from settings activity and after finish settings activity I want ViewPager
in main activity to refresh the fragment to match the language selection from the user and load the Arabic content if user choose Arabic here what I did to work from the first trr :D
1. you must use FragmentStatePagerAdapter .*
mainActivity I overrided the onResume
and did the following
if (!(mPagerAdapter == null)) {
mPagerAdapter.notifyDataSetChanged();
}
I ovveride the getItemPosition()
in mPagerAdapter
and make it return POSITION_NONE.
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
works like charm
Upvotes: 24
Reputation: 346
getActivity.recreate() will recreate activity hence all fragments
Upvotes: 2
Reputation: 7474
on @Emil-adz solution we can go little ahead because we got fragment listy in my case called _fragments we can return fragment position like this:
@Override
public int getItemPosition(Object object) {
/** check if object is fragment class */
if (object.getClass().isAssignableFrom(Fragment.class)) {
/** cast object to fragment */
Fragment customFragment = (Fragment)object;
/** return fragment position from our list */
return _fragments.indexOf(customFragment);
} else {
/** else re-create */
return POSITION_NONE;
}
}
Upvotes: 0
Reputation: 41119
As been suggested here by @Luksprog, changing my adapter class to this:
public class ViewPagerAdapter extends FragmentPagerAdapter
{
private List<Fragment> fragments;
/**
* @param fm
* @param fragments
*/
public ViewPagerAdapter(FragmentManager fm, List<Fragment> fragments) {
super(fm);
this.fragments = fragments;
}
/* (non-Javadoc)
* @see android.support.v4.app.FragmentPagerAdapter#getItem(int)
*/
@Override
public Fragment getItem(int position) {
return this.fragments.get(position);
}
/* (non-Javadoc)
* @see android.support.v4.view.PagerAdapter#getCount()
*/
@Override
public int getCount() {
return this.fragments.size();
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
}
Fixed my issue.
what I did was to add this method:
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
Upvotes: 12