如何使用AsyncTaskLoader更新ViewPager的Fragment中的内容?

时间:2016-04-05 11:44:39

标签: android android-fragments android-loadermanager android-loader

我尝试使用AsyncTaskLoader FragmentViewPager的孩子DayFragment。在我的public class DayFragment extends Fragment implements LoaderManager.LoaderCallbacks<DayAdapter.DayItem[]> { private static final int CONTENT_LOADER = 0; private DayAdapter mAdapter = null; private int mWeekNumber = 1; private int mDayCode = 1; private Table.Timetable mTimetable; private RecyclerView mRVContent; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final MainActivity mainActivity = (MainActivity) getActivity(); View v = inflater.inflate(R.layout.content, container, false); mRVContent = (RecyclerView) v.findViewById(R.id.rvContent); RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(mainActivity); mRVContent.setLayoutManager(layoutManager); mAdapter = new DayAdapter(getActivity()); mRVContent.setAdapter(mAdapter); //Initialize the cursor loader getLoaderManager().initLoader(CONTENT_LOADER, null, this).forceLoad(); return v; } @Override public Loader<DayAdapter.DayItem[]> onCreateLoader(final int id, Bundle args) { if(CONTENT_LOADER == id) { return new ContentLoader(getContext(), mWeekNumber, mDayCode, mTimetable); } return null; } @Override public void onLoadFinished(Loader loader, DayAdapter.DayItem[] items) { if(CONTENT_LOADER == loader.getId()) { mAdapter.setIs24HourFormat(SettingsManager.is24HourFormat(getContext())); mAdapter.clear(); for (DayAdapter.DayItem item : items) { mAdapter.add(item); } mAdapter.notifyDataSetChanged(); if (items.length == 0) { mRVContent.setBackgroundResource(R.drawable.bg_lesson_empty); } else { mRVContent.setBackgroundColor(0xFFFFFFFF); } } } @Override public void onLoaderReset(Loader loader) { } private static final class ContentLoader extends AsyncTaskLoader<DayAdapter.DayItem[]> { private final int mWeekNumber; private final int mDayCode; private final Table.Timetable mTimetable; public ContentLoader(Context context, final int weekNumber, final int dayCode, Table.Timetable timetable) { super(context); mWeekNumber = weekNumber; mDayCode = dayCode; mTimetable = timetable; } @Override public DayAdapter.DayItem[] loadInBackground() { DatabaseHandler db = new DatabaseHandler(getContext()); db.openReadable(); List<Table.Lesson> lessons = db.findLessons(mDayCode, mWeekNumber, mTimetable.getId()); DayAdapter.DayItem[] items = new DayAdapter.DayItem[lessons.size()]; for (int i = 0; i < items.length; ++i) { Table.Lesson lesson = lessons.get(i); Table.Subject subject = db.getSubject(lesson.getSubjectId()); Table.Teacher teacher = db.getTeacher(lesson.getTeacherId()); if (teacher == null) { teacher = new Table.Teacher(""); //Empty name } items[i] = new DayAdapter.DayItem() .setId(lesson.getId()) .setTitle(subject.getTitle()) .setSubtitle(teacher.getName())); } db.close(); return items; } } } 的代码下面:

PageAdapater

public class PageAdapter extends FragmentStatePagerAdapter { public static final int PAGE_COUNT = 7; private int mWeekNumber; private final int[] mDayCodes; private final String[] mDays; private final DayFragment[] mFragments = new DayFragment[7]; private Table.Timetable mTimetable; private boolean mIsRebuildMode = false; public PageAdapter(Context context, FragmentManager fm, Table.Timetable timetable, final int weekNumber) { super(fm); //Initialize class members } @Override public Fragment getItem(int position) { DayFragment dayFragment; if (mFragments[position] == null) { dayFragment = new DayFragment(); Bundle args = new Bundle(); args.putSerializable(Keys.TIMETABLE, mTimetable); dayFragment.setArguments(args); dayFragment.setWeekNumber(mWeekNumber); dayFragment.setDayCode(mDayCodes[position]); mFragments[position]= dayFragment; } else { dayFragment = mFragments[position]; } return dayFragment; } @Override public void restoreState(Parcelable arg0, ClassLoader arg1) { //do nothing here! no call to super.restoreState(arg0, arg1); } public void setWeekNumber(final int weekNumber) { mWeekNumber = weekNumber; Arrays.fill(mFragments, null); } public void setIsRebuildMode(final boolean isRebuildMode) { mIsRebuildMode = isRebuildMode; } @Override public CharSequence getPageTitle(final int position) { return mDays[position]; } @Override public int getCount() { return PAGE_COUNT; } @Override public int getItemPosition(Object object) { if(mIsRebuildMode) { return POSITION_NONE; } return super.getItemPosition(object); } }

onLoadFinished

但它并没有调用Log方法。我检查了LoaderManager输出... onCreateLoader来电onLoadFinished,但除了第一次运行(当应用启动时,ViewPager显示第一页(Fragment时,它永远不会调用LoaderManager {1}}))。一切都好!如果我将页面切换到下一页和下一页并返回第一页onLoadFinished,也不会为第一页调用onCreateLoader。但它会创建加载器调用onLoaderReset并重置加载器调用[["aniket", 6], ["shivam", 7], ["tiwari", 8], ["abhijeet", 9]] 。这是Google的笑话吗?

1 个答案:

答案 0 :(得分:1)

请参阅片段生命周期。 ViewPager不会创建片段,只需轻扫它们

- 启动ViewPager : 创建 :createView :开始 :简历

如果你滑动片段,

没有改变

---睡觉智能手机 :暂停 :停止

---唤醒智能手机 :开始 : 恢复 :暂停

---关闭ViewPager : 停 :分离