完成片段后,Loader不刷新适配器

时间:2013-11-25 19:48:38

标签: android android-fragments actionbarsherlock


编辑:看起来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;
    }
}

3 个答案:

答案 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()