0

ViewPagerの子であるFragmentAsyncTaskLoaderを使用しようとしています。私DayFragmentのコード下:AsyncTaskLoaderを使用してViewPagerのフラグメント内のコンテンツを更新するにはどうすればよいですか?

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出力をチェックしました... LoaderManageronCreateLoaderを呼び出しますが、最初の実行(アプリケーションが起動したときはViewPagerが最初のページ(Fragment)を示す)を除いて、onLoadFinishedを呼び出すことはありません。それはすべてです!その後、次のページと次のページに切り替えて最初のページに戻ると、LoaderManagerは最初のページもonLoadFinishedと呼ばれません。しかし、ローダーを作成してonCreateLoaderを呼び出し、onLoaderResetを呼び出すローダーをリセットします。それはGoogleからの冗談ですか?

+0

を切り離しますか?私はあなたのコードの非常に簡単なテストを行い、それは働いて、onLoadFinishedを示しています。そして、btw、onLoaderResetはログに表示されませんでした。 –

+0

いいえ、フラグメントインスタンスにリストが含まれています。アダプタは既に作成されたフラグメントを返します –

+0

アダプタをFragmentPagerAdapterに変更すると、何か変更されますか?私はこれを再現することができません(あなたのフィールドをすべて持っていないので、私のフラグメントの実装を入れてください)。 support.v4のインポートはどこでも使えますか? –

答えて

1

フラグメントのライフサイクルを参照してください。 ViewPagerは再ちょうどそれらに

をスワイプ、フラグメントを作成しないでください - スタートViewPager :CREATEVIEW :: 開始:---あなたが断片

をスワイプ変わらない

を再開睡眠スマートフォン を作成します : を一時停止:履歴書 : を開始:PAスマートフォン をウェイクアップ---

を停止

--- ViewPager 閉じるを使用します。 を停止します。あなたのPagerAdapterの)あなたは(新しいDayFragmentにのgetItem内のすべての時間を作成してください

+0

' ViewPager'が毎回ビューを再作成するのはなぜですか? –

+0

私はあなた自身でそれをチェックすることができますか分からない。内部フラグメントのロギングを追加し、ライフサイクルを参照してください。私はViewPagerも使用して、今この経験をしています。結果は上に表示されます – koa73

+0

私のアダプタは、キャッシュされたビューを持っていないときにすべてのフラグメントに対して 'onCreate'と' onCreateView'メソッドの断片を呼び出すと、出力をチェックしました。変数 'mIsRebuildMode'の値は' false'です。 –

関連する問題