编辑:看起来ViewPager没有反映底层适配器的更改 - 正确调用swapCursor(),但从不调用getItem()。我在SO上找到了similar problem的解决方案,但在我的情况下它并没有帮助。 编辑2&解决方案:感谢this answer我发现我正在向CalendarPageAdapter提供FragmentManager而不是ChildrenFragmentManager。
我有SherlockFragmentActivity,它拥有一个ViewPager。同样的活动实现了LoaderCallbacks,它在onLoadFinished()中刷新了myAdapter。
我将此活动移动到Fragment - 因此它扩展了SherlockFragment并仍然实现了LoaderCallbacks,但是交换游标停止了工作。在onLoadFinished()中,游标中提供了正确的数据,但没有交换任何内容。我没有更改适配器中的任何内容,也没有更改寻呼机填充的片段。哪里有问题?
我的新片段如下:
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
}
}
我的适配器很简单就像这样:
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;
}
}
答案 0 :(得分:0)
如果我理解正确,您的Cursor
会加载适配器数据,但AdapterView
不反映该更改。如果是这种情况,请尝试在onLoadFinished(Loader<Cursor> loader, Cursor data)
方法的末尾添加此行:
myAdapter.notifyDataSetChanged();
答案 1 :(得分:0)
哦,我的!第二个编辑是正确的:使用getChildFragmentManager()而不是getFragmentManager()。在我卸载应用程序和/或清除项目之前,我的更改不适用。该死的,Eclipse!
答案 2 :(得分:0)
@shmoula @NitroNbg
我和你们两个人有同样的问题,但在不同的情况下
我有一个带有viewpager的活动(也是日历),每个页面都是一个带有加载器的片段:
<强>活动强>
...
fragmentPagerAdapter = new MainFragmentPagerAdapter(getSupportFragmentManager(), calendarView.getCalendarDays());
...
FragmentStatePagerAdapter
public class MainFragmentPagerAdapter extends FragmentStatePagerAdapter {
...
public MainFragmentPagerAdapter(FragmentManager fm, ArrayList<CalendarDay> calendarDays) {
super(fm);
...
}
public int getCurrentIndex(String currentDate) {
int index = dateTimes.indexOf(currentDate);
return index;
}
@Override
public Fragment getItem(int i) {
return EventByDayFragment.newInstance(dateTimes.get(i));
}
@Override
public int getCount() {
return dateTimes.size();
}
}
<强>片段强>
public class EventByDayFragment extends Fragment implements LoaderManager.LoaderCallbacks<Cursor> {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
containerView = inflater.inflate(R.layout.fragment_event_by_day, container, false);
findViews();
return containerView;
}
...
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
mainEventsAdapter.swapCursor(data);
listView.onRefreshComplete();
mainEventsAdapter.notifyDataSetChanged();
}
...
private void setInitData() {
mainEventsAdapter = new MainEventsAdapter(getActivity());
listView.setAdapter(mainEventsAdapter);
}
...
}
但在我的情况下,我不能使用getChildFragmentManager()