EDIT: It looks like ViewPager does not reflect change of underlying adapter - swapCursor() is called correctly, but getItem() is never called. I found a solution to similar problem on SO, but it does not helped in my case. EDIT 2 & SOLUTION: Thanks to this answer I found out that I'm providing a FragmentManager instead of ChildrenFragmentManager to CalendarPageAdapter.
I had SherlockFragmentActivity, which held a ViewPager. The same activity implemented LoaderCallbacks, which refreshed myAdapter in the onLoadFinished().
I moved this activity to a Fragment - so it extends SherlockFragment and still implements LoaderCallbacks, but swapping cursor stopped working. In onLoadFinished() correct data provided in cursor, but nothing is swapped. I didn't changed anything in my adapter nor fragment for pager filling. Where can be problem?
My new fragment is as follows:
public class MyFragment extends SherlockFragment implements LoaderCallbacks<Cursor> {
private CalendarPageAdapter myAdapter;
private ViewPager viewPager;
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.my_fragment, container, false);
myAdapter = new CalendarPageAdapter(getChildFragmentManager()); // <- EDIT 2
viewPager = (ViewPager) view.findViewById(R.id.pager);
viewPager.setAdapter(myAdapter);
return view;
}
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
getLoaderManager().initLoader(0, null, this);
}
. . . .
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
myAdapter.swapCursor(data);
viewPager.setCurrentItem(data.getCount()); // skip to last column
printoutCursorContent(); // prints out correct cursor content
}
}
And my adapter is simple just like this:
public class CalendarPageAdapter extends FragmentStatePagerAdapter {
private Cursor cursor;
public CalendarPageAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
cursor.moveToPosition(position);
int calendarId = cursor.getInt(cursor.getColumnIndex(CalendarTable.COLUMN_ID));
return DayFragment.newInstance(calendarId);
}
@Override
public int getCount() {
if (cursor == null)
return 0;
else
return cursor.getCount();
}
public void swapCursor(Cursor c) {
if (cursor == c)
return;
cursor = c;
notifyDataSetChanged();
}
public Cursor getCursor() {
return cursor;
}
}