FragmentPagerAdapter and notifyDataSetChanged - android

How can I use notifyDataSetChanged with FragmentPagerAdapter ?
In onResume:
I used mMyFragmentPagerAdapter.notifyDataSetChanged(); but it didnt worked
But mMyFragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager()); is worked
public class Activity extends FragmentActivity{
static ViewPager mViewPager;
private MyFragmentPagerAdapter mMyFragmentPagerAdapter;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mViewPager = (ViewPager) findViewById(R.id.pager);
mMyFragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager());
mViewPager.setAdapter(mMyFragmentPagerAdapter);
}
private static class MyFragmentPagerAdapter extends FragmentPagerAdapter {
...
}
#Override
protected void onResume() {
super.onResume();
//WORKS
mMyFragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager());
mViewPager.setAdapter(mMyFragmentPagerAdapter);
//DOESN'T WORK
mMyFragmentPagerAdapter.notifyDataSetChanged();
mViewPager.setAdapter(mMyFragmentPagerAdapter);
}
}
Populate:
public void startView() {
this.questions.clear(); // this.questions is a LinkedList
this.questions.add(q);
}

First of all, to update a ListView / ViewPager or any other kind of view and it's adapter,you need to requery the Cursor for example if you are using it to populate the view. So as in your situation, you have a ViewPager and an Adapter. So the first thing which you consider is the way you update your LinkedList. In your situations you are doing it right, but in my opinion this.quetions in your external class is different than the LinkedList you are using to populate your adapter. In this case I would suggest you don't use external class to update your adapter. If that is too hard to achieve depending on the code organisation, just be sure that you are using the same LinkedList in your Fragment and external class.

Change your adapter extends FragmentPagerAdapter to FragmentStatePagerAdapter and then the notifyDataSetChanged work fine.
It's work for me.

Related

Android 'FragmentManager is already executing transactions' when notifydatasetchanged runs on ui thread

I'm using a TabLayout with ViewPager. I have two tabs in my tab layout which both have a different instances of the same fragment object. Both fragments have the same recycler view layout as well.
Problem: When I load the entire activity after getting the server objects back, I'm trying to populate both tab views with the new object, but I get the following error:
java.lang.IllegalStateException: FragmentManager is already executing
transactions
. So in my main activity:
public class MyMainActivity extends FragmentActivity {
private TabLayout tabLayout;
private ViewPager viewPager;
private MyAdapter adapter;
private MyFragment fragmentA;
private MyFragment fragmentB;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_activity);
tabLayout = (TabLayout)findViewById(R.id.tab_layout);
viewPager = (ViewPager)findViewById(R.id.view_pager);
adapter = new MyAdapter(getSupportFragmentManager(), new
ArrayList<>(), new ArrayList<>());
// Instantiate the fragments here
adapter.addFragment(....A, "Title A");
adapter.addFragment(....B, "Title B");
.....
.....
.....
viewPager.setAdapter(adapter);
tabLayout.setupWithViewPager(viewPager);
}
public void refreshPage() {
runOnUiThread(new Runnable() {
#Override
public void run() {
// This line crashes
adapter.notifyDataSetChanged();
}
});
}
}
I tried using getChildFragmentManager but I can't because you need to call that via a fragment object. I cannot show much code as most of it is proprietary and I had to make the code as generic as possible.
When I comment out the line that crashes, my recycler view for the first tab does not refresh unless I scroll. while the second tab does not refresh at all. Did anyone have the same issue before? How did you resolve it?
P.S I'm not using any FragmentManager or transactions so I'm not sure why it gives me that exception.

FragmentManager is always null

so this one really has me stumped. I am trying to create a simple ViewPager activity which has three swipe views containing a listview. I have a FragmentPagerAdapter, a ListFragment set to hold the listviews, and have defined the layout for the fragments. Here is my problem is that FragmentPagerAdapter takes a FragmentManager, so I try to pass it in like so
mFragmentPagerAdapter=new FragmentPagerAdapter(getSupportFragmentManager());
but the FragmentManager is always null, meaning that the rest of the work to set up the pager crashes the app
I have no idea why getSupportFragmentManager would return null.
Here is the code for my activity, or at least the relevant bits
public class JobListActivity extends FragmentActivity {
private ArrayList<Job> jobsQuote=new ArrayList<Job>();
private ArrayList<Job> jobsIn= new ArrayList<Job>();
private ArrayList<Job> jobsOut=new ArrayList<Job>();
private ListFragment quoteListFragment=new ListFragment();
private ListFragment inListFragment =new ListFragment();
private ListFragment outListFragment=new ListFragment();
JobFragmentPagerAdapter mFragmentPagerAdapter;
ViewPager mViewPager;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_job_list);
FragmentManager fm = getSupportFragmentManager();
mFragmentPagerAdapter =
new JobFragmentPagerAdapter(fm);
mViewPager = (ViewPager) findViewById(R.id.jobs_view_pager);
mViewPager.setAdapter(mFragmentPagerAdapter);
I really appreciate any help you can provide, thanks so much for your time
Here is the tutorial I have been following from the android developer web site
http://developer.android.com/training/implementing-navigation/lateral.html
clearly I am missing something.
Figured it out. When I implement the methods from Fragment activity, I accidentily overrode getSupportFragmentManager(); to return null.

Updating fragments/views in viewpager with fragmentStatePagerAdapter

Need some help with my problem of updating pages while using viewpager. I am using a simple viewpager with FragmentStatePagerAdapter. All I want to do is get access to the current fragment/view so as I can update some textviews in my fragment/view. I searched around in the forum and came to know few things
- One of the ways to handle this is by setting tag in instantiateItem() call back of the adapter and retreive the view by findViewbyTag. I could not understand how to implement this and I am also not sure if that will work for FragmentStatePagerAdapter.
- I explored other options as suggested in various forums, but cannot make them work.
My code is very much same as in a android http://developer.android.com/training/animation/screen-slide.html. Basic components are the same (Fragment activity xml with some display components including a textview, viewpager xml with just a view pager in it, a Fragment class and the main FragmentActivity class). in my FragmentActivity class I have added a pageChangelistener to my viewpager so as I can do my textview changes during onPageSelected().
Any help is is appreciated.
Adding the code for reference.
Public class myActivity extends FragmentActivity
//Variable declarations
protected void onCreate(Bundle savedInstanceState) {
ViewPager mPager = (ViewPager) findViewById(R.id.pager);
mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager());
mPager.setAdapter(mPagerAdapter);
View CurrView;
OnPageChangeListener pageChangelistener = new OnPageChangeListener() {
#Override
public void onPageSelected(int pageSelected) {
doTextViewChnges();//access the text view and update it based on pageSelected
---THIS IS WHERE I AM STUCK IN TRYING TO GET THE TEXTVIEW IN MY CURRENT FRAGMWNT/VIEW-------
}
mPager.setOnPageChangeListener(pageChangelistener);
}
private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
public ScreenSlidePagerAdapter(android.support.v4.app.FragmentManager fm) {
super(fm);
}
#Override
public android.support.v4.app.Fragment getItem(int position) {
return ScreenSlidePageFragment.create(position, <other parameters I want to pass>);
}
#Override
public int getCount() {
return NUM_PAGES;
}
}
in your OnPageChangeListener:
OnPageChangeListener pageChangelistener = new OnPageChangeListener() {
#Override
public void onPageSelected(int pageSelected) {
ScreenSlidePageFragment currentFragment = (ScreenSlidePageFragment) mPagerAdapter.getItem(pageSelected)
doTextViewChnges();//access the text view and update it based on pageSelected
---THIS IS WHERE I AM STUCK IN TRYING TO GET THE TEXTVIEW IN MY CURRENT FRAGMWNT/VIEW-------
}
i assume you want to access your fragments from your activity and update the views.Fragments are parts of activities and their views can be accessed by them. Fragments are created dynamically in viewadapters and there is no straight forward and easy way to Tag them. You may simply access a fragment by its index number.first one is 0 second one is 1 and so on...
//access your fragment(in your case your first fragment)
//this part should be inside your doTextViewChnges()
Fragment fragment = (Fragment ) adapterViewPager
.getFragment(0);
if (fragment != null) {
//call a public method inside your fragment to update your text view
fragment .updateYourTextView();
}
Edit: inside your fragment create the following method and update your textview from there.
void updateYourTextView() {
yourTextView.setText("yourtext");
}

Android:Null Pointer in ViewPager

I am making an app in which i am using ViewPAger and my code is working fine on S2 and NOTE but i checked on Y its giving exception on viewPagerAdapter. My code is as follows:
static PagerAdapter mPagerAdapter;
static ViewPager mViewPager;
static ViewPagerIndicator mIndicator;
static String addposition;
public Context _context=this;
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Create our custom adapter to supply pages to the viewpager.
mPagerAdapter = new PagerAdapter(getSupportFragmentManager());
mViewPager = (ViewPager)findViewById(R.id.pager);
mViewPager.setAdapter(mPagerAdapter); // **Null Pointer Exception**
You can not write public Context _context=this; in global. You should initialize the content in onCreate().
Edit
Actually I had not seen that you are not using the context. I think there is an issue in the ViewPager. May be you are getting null object of ViewPager. If you show your xml then we can provide a better solution

ViewPagerIndicator inside a Fragment: NullPointer with Adapter

I've tried to use this answer to use a ViewPager with indicator inside a fragment, like so. (Just a mock up).
There's navigation spinner that changes the fragment. Each "page" would contain a ListView.
So basically I'm looking for:
SherlockFragmentActivity -> SherlockFragment -> ViewPager -> ListView
However, when I try and implement what I saw in the answer I get an error with findViewById();
I assume it's because I'm not getting the correct "context".
Here's my Fragment:
public class HomeViewFragment extends SherlockFragment {
private ViewPager mPager;
private HomePagerAdapter mAdapter;
private TitlePageIndicator mIndicator;
private Context context;
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
context = getSherlockActivity().getApplicationContext();
mAdapter = new HomePagerAdapter(context);
mPager = (ViewPager)context.findViewById(R.id.pager);
mPager.setAdapter(mAdapter);
mIndicator = (TitlePageIndicator)context.findViewById(R.id.indicator);
mIndicator.setViewPager(mPager);
}
#Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
}
Step #1: Delete context = getSherlockActivity().getApplicationContext();
Step #2: Replace context.findViewById with getActivity().findViewById
Step #3: Replace all remaining occurrences of context with getActivity()
Step #4: Delete your onActivityCreated() implementation, as it is not doing anything
Step #5: Resolve that you will never again use getApplicationContext() unless you know specifically why you need it in a given circumstance

Categories

Resources