viewPager+fragment 캐 시 fragment 새로 고침 방법

6105 단어 viewpagerfragment
최근 에 한 항목 을 만 들 고 있 는데,한 기능 은 문 제 를 풀 고 페이지 를 넘 기 는 것 이다.따라서 이 페이지 에 다음 페이지 를 캐 시 하 는 것 이 필요 합 니 다.
아까 부터 저 는 썼어 요.

setOnPageChangeListener    ,              :
 public void onPageSelected(int position)
{
 ReadFragment fragment= (ReadFragment) fragmentArrayList.get(position);
 fragment.refresh();
}
그러나 이 페이지 로 미 끄 러 질 때 만 fragment Array List.get(position)으로 현재 페이지 를 가 져 올 수 있 습 니 다.이 방법 으로 다음 페이지 의 fragment 를 가 져 오 면 빈 지침 을 알려 줍 니 다.다음 페이지 의 내용 을 먼저 캐 시 할 수 없다 는 것 이다.
도대체 어떻게 해야만 다음 페이지 의 fragment 를 얻 을 수 있 습 니까?
바 이 두 가 봤 는데 있다 고 하 더 라 고요.
Fragment PagerAdapter 의 instantiate Item()처리.그래서 나 는 그것 의 소스 코드 를 보 았 다.

@Override
  public Object instantiateItem(ViewGroup container, int position) {
    if (mCurTransaction == null) {
      mCurTransaction = mFragmentManager.beginTransaction();
    }
    final long itemId = getItemId(position);
    // Do we already have this fragment?
    String name = makeFragmentName(container.getId(), itemId);
    Fragment fragment = mFragmentManager.findFragmentByTag(name);
    if (fragment != null) {
      if (DEBUG) Log.v(TAG, "Attaching item #" + itemId + ": f=" + fragment);
      mCurTransaction.attach(fragment);
    } else {
      fragment = getItem(position);
      if (DEBUG) Log.v(TAG, "Adding item #" + itemId + ": f=" + fragment);
      mCurTransaction.add(container.getId(), fragment,
          makeFragmentName(container.getId(), itemId));
    }
    if (fragment != mCurrentPrimaryItem) {
      fragment.setMenuVisibility(false);
      fragment.setUserVisibleHint(false);
    }
    return fragment;
  }
이 를 통 해 알 수 있 듯 이 instantiate Item 방법 은 List 에 가서 Fragment 를 받 는 것 이 아니 라 Fragment Manager 에서 Tag 를 통 해 해당 하 는 Fragment 를 찾 습 니 다.찾 을 수 있 으 면 List 에 가서 가 져 오지 않 습 니 다.이런 상황 에서 저 는 adapter 에 이 방법 을 추 가 했 습 니 다.

 public ReadFragment getFragment(int position)
  {    String tag = getFragmentTag(mContainer.getId(),position);
    ReadFragment fragment = (ReadFragment) fm.findFragmentByTag(tag);
    return fragment;
  }
  /**
   *         FragmentPagerAdapter getFragmentTag   
   * @param viewId
   * @param index
   * @return
   */
  private String getFragmentTag(int viewId, int index)
  {
    try {
      Class<FragmentPagerAdapter> cls = FragmentPagerAdapter.class;
      Class<?>[] parameterTypes = { int.class, long.class };
      Method method = cls.getDeclaredMethod("makeFragmentName",
          parameterTypes);
      method.setAccessible(true);
      String tag = (String) method.invoke(this, viewId, index);
      return tag;
    } catch (Exception e) {
      e.printStackTrace();
      return "";
    }
  }
onPageSelected 에서 getFragment(int position)방법 을 호출 하여 이 페이지 가 선택 되 었 을 때 다음 페이지 를 먼저 캐 시 하여 새로 고 칩 니 다.
getFragment(int position)방법 은 캐 시 를 받 은 fragment 입 니 다.하지만 이 fragment 가 먼저 viewpager 에 캐 시 되 었 음 을 보증 해 야 합 니 다.내용 이 새로 고침 되 지 않 았 지만 빈 지침 을 알 리 지 않 습 니 다.
문제 가 생 겼 습 니 다.onPageSelected 는 viewPager 에서 첫 페이지 를 보 여줄 때 호출 되 지 않 기 때문에 첫 페이지 의 내용 은 따로 새로 고 쳐 야 합 니 다.onPageSelected 에서 새로 고 칠 수 없습니다.
initData()를 만 들 고 새로 고침 합 니 다.
viewPager 가 첫 페이지 를 보 여줄 때 onPageSelected 를 사용 하지 않 기 때문에 첫 페이지 와 두 번 째 페이지 의 내용 을 먼저 캐 시 할 수 없 기 때문에 첫 페이지 와 두 번 째 페이지 의 내용 은 모두 initData 에서 단독으로 갱신 해 야 하고 다른 것 은 onPageSelected 안의 방법 으로 갱신 해 야 합 니 다.
여기까지 와 서 생각 을 정리 하 자.
방금 인터페이스 에 들 어 갔 을 때:첫 페이지 를 새로 고치 고 두 번 째 페이지 를 캐 시 합 니 다.
페이지 넘 길 때:첫 페이지 에서 두 번 째 페이지 로 넘 기 고 onPageSelected()를 실행 합 니 다.
              onPager Selected 에서 getFragment(int position)를 호출 하여 다음 페이지 인 세 번 째 페이지 의 fragment 를 가 져 온 다음 캐 시 내용 을 새로 고 칩 니 다.
              두 번 째 페이지 에서 세 번 째 페이지 로 넘 기기:onPageSelected()실행
              onPager Selected 에서 getFragment(int position)를 호출 하여 다음 페이지 인 네 번 째 페이지 의 fragment 를 가 져 온 다음 캐 시 내용 을 새로 고 칩 니 다.
그 결과 또 하나의 문제 가 생 겼 다.첫 페이지 에서 두 번 째 페이지 로 넘 어 갈 때 반 짝 이 며 빈 지침 을 알려 주 었 다.
나중에 디 버 깅 을 해 보 니 getFragment 방법 으로 얻 은 fragment 가 null 인 것 을 발 견 했 습 니 다.일리 가 없습니다.왜 마지막 에 세 번 째 페이지 의 fragment 가 view Pager 에 캐 시 되 지 않 았 기 때 문 이 었 는 지 생각 했 습 니 다.우리 의 getFragment 는 캐 시 에서 tag 표 시 를 통 해 가 져 왔 습 니 다.
어떻게 해야만 세 번 째 fragment 가 view Pager 에서 캐 시 를 받 을 수 있 습 니까?
기본적으로 viewpager 는 첫 페이지 에 두 번 째 페이지 를 캐 시 하고 두 번 째 페이지 에 이 르 렀 을 때 첫 번 째 와 두 번 째 페이지 를 캐 시 합 니 다.한편,onPager Selected 는 fragment 에서 화면 반 이상 미 끄 러 지고 손가락 을 놓 아야 호출 됩 니 다.손가락 을 놓 지 않 으 면 호출 되 지 않 습 니 다.손가락 을 놓 으 면 onPager Selected 가 호출 되 었 을 때 세 번 째 페이지 는 캐 시 되 지 않 았 습 니 다.
어 떡 하지?나 또 생각 났 어.@Override public void onPageScrollStateChanged(int state) {}안에서 state=2,즉 미끄럼 이 멈 췄 을 때 캐 시가 이 페이지 를 새로 고치 고 마지막 에 한 가지 문 제 를 발견 할 수 있다 고 생각 했 습 니 다.
원래 미끄럼 정지 란 손가락 의 미끄럼,즉 손가락 이 화면 을 떠 나 는 것 을 가리 키 며,fragment 의 미끄럼 을 바 꾸 는 것 을 가리 키 지 않 는 다.
어떻게,두려워 하지 마 세 요:또 하나의 방법 이 있 습 니 다:readViewPager.setOffscreenPageLimit(2);
이 방법 은 너 에 게 답 을 줄 수 있다.
이 방법 은 viewPager 현재 페이지 양쪽 의 캐 시 수 를 설정 할 수 있 습 니 다.readViewPager.setOffscreenPageLimit(2);현재 페이지 좌우 에 각각 2 개의 캐 시 를 저장 합 니 다.viewPager 의 기본 값 은 readViewPager.set OffscreenPageLimit(1)입 니 다.
이렇게 하면 OK?기뻐 하기 에는 너무 이르다.5 페이지 까지 미 끄 러 졌 을 때 문제 가 생 겨 서 공백 이 었 습 니 다.readViewPager.setOffscreenPageLimit(3)로 변경 하기;마찬가지 입 니 다.
(이때 저 는 모두 4 개의 fragment 만 있 었 습 니 다.저 는 무한 순환 모드 를 사 용 했 습 니 다.실제 fragment 는 4 개)이 고 실제 캐 시 는 5 개의 fragment(현재 페이지 에 좌우 두 개 추가)가 있 습 니 다.여기 서 문제 가 발생 하 는 것 이 아 닙 니까?
그래서 나 는 fragment 를 5 개 로 바 꾸 었 는데 결 과 는 괜 찮 았 다.
그러나 페이지 를 넘 길 때 문제 가 생 겼 고 몇 페이지 를 넘 긴 후에 공백 페이지 가 생 겼 다.그래서 나 는 6 개의 fragment 로 바 뀌 어서 전혀 문제 가 없 었 다.어지럽다
그리고 페이지 를 다시 넘 기 려 면 캐 시 내용 을 새로 고 쳐 야 합 니 다.
위 에서 말 한 것 은 편집장 이 여러분 에 게 소개 한 viewPager+fragment 가 캐 시 fragment 를 새로 고 치 는 방법 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.편집장 은 신속하게 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기