안 드 로 이 드 는 오늘 의 톱 여러 fragment 게 으 른 로 딩 의 실현 을 모방 합 니 다.

머리말
최근 에 시간 이 있어 서 저 는 새로운 글 을 두 번 추 가 했 습 니 다.fragment 게 으 름 로드 실현 은 작은 모듈 이지 만 해 본 사람들 은 모두 알 고 있 습 니 다.쉽게 성공 하지 못 할 것 입 니 다.당신 을 뒤 척 이 며 밤 을 새 워 잠 을 이 루 지 못 하고 끊 임 없 이 이 어 지게 합 니 다.나 는 오늘 의 톱 스타일 에 따라 게 으 른 로드 기능 을 만 들 었 다.글 의 절반 이 되면 사람들 이 만 날 수 있 는 데 이 터 를 불 러 오지 않 는 구 덩이 를 설명 하고 스 포 일 러 를 하지 않 습 니 다.
Fragment 의 생명주기 회고

github 코드 직통 차  ( 로 컬 다운로드
여 기 는 오늘 의 특종 효과 입 니 다:

자제 효과,진실 이 있 음:

실현 방향:
Fragment 클래스 자체 테이프 방법 setUserVisibleHint()를 사용 하여 현재 fragment 가 사용자 에 게 보 이 는 지 여 부 를 판단 하고 리 셋 된 isVisibleToUser 매개 변수 에 따라 관련 논리 적 판단 을 합 니 다.이 방법 을 다시 쓰 면 변수 isVisible 을 만 들 고 보 이 는 표 지 를 가 져 옵 니 다.
그러나 isVisible 판단 에 따라 데 이 터 를 직접 불 러 옵 니 다.onCreateView()방법 이 실행 되 지 않 았 을 수도 있 습 니 다.이 경우 NullPointer Exception 빈 포인터 이상 이 발생 할 수 있 습 니 다.따라서 컨트롤 초기 화 를 만족 시 켜 야 사용자 가 볼 수 있 고 데 이 터 를 불 러 올 수 있 습 니 다.

LazyloadFragment 게 으 른 로 딩 fragment 구현:

public abstract class LazyloadFragment extends Fragment {
 protected View rootView;
 private boolean isInitView = false;
 private boolean isVisible = false;

 @Nullable
 @Override
 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
  rootView = inflater.inflate(setContentView(), container, false);
  init();
  isInitView = true;
  isCanLoadData();
  return rootView;
 }

 @Override
 public void setUserVisibleHint(boolean isVisibleToUser) {
  super.setUserVisibleHint(isVisibleToUser);

  //isVisibleToUser  boolean   : Fragment UI       ,         
  if(isVisibleToUser){
   isVisible = true;
   isCanLoadData();
  }else{
   isVisible = false;
  }
 }

 private void isCanLoadData(){
  //     view            
  if(isInitView && isVisible ){
   lazyLoad();

   //        
   isInitView = false;
   isVisible = false;
  }
 }

 /**
  *         
  * @return
  */
 protected abstract int setContentView();

 /**
  *      view fragment         
  */
 protected abstract void init();

 /**
  *         
  */
 protected abstract void lazyLoad();

}
하위 fragment 로 딩 데이터:

public class PageFragment extends LazyloadFragment implements XRecyclerView.LoadingListener {
 private CommonAdapter<String> adapter;
 private ArrayList<String> datas = new ArrayList<>();
 private XRecyclerView recyclerView;
 private Handler handler = new Handler();

 @Override
 public int setContentView() {
  return R.layout.fragment_page;
 }


 @Override
 public void init() {
  recyclerView = rootView.findViewById(R.id.recyclerview);
  recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
  adapter = new CommonAdapter<String>(getActivity(),R.layout.item,datas) {
   @Override
   protected void convert(ViewHolder holder, String s, int position) {

   }
  };
  recyclerView.setAdapter(adapter);
  recyclerView.setPullRefreshEnabled(true);
  recyclerView.setLoadingListener(this);

 }

 @Override
 public void lazyLoad() {
  recyclerView.refresh();
 }

 @Override
 public void onRefresh() {
  handler.postDelayed(new Runnable() {
   @Override
   public void run() {
    recyclerView.refreshComplete();
    for(int i=0;i<10;i++){
     datas.add("");
    }
    adapter.notifyDataSetChanged();
   }
  },500);
 }

 @Override
 public void onLoadMore() {

 }
}
마지막 Mainactivity 코드:

public class MainActivity extends AppCompatActivity {
 private TabLayout tabLayout;
 private String[] topics = new String[]{"  ","  ","  ","  ","  ","  "};
 private ViewPager viewPager;
 private ArrayList<Fragment> fragments = new ArrayList<>();

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
  setContentView(R.layout.activity_main);

  init();
 }

 private void init() {
  viewPager = (ViewPager) findViewById(R.id.viewpager);
  tabLayout = (TabLayout) findViewById(R.id.tablayout);
  viewPager.setOffscreenPageLimit(3);

  for(int i=0;i<topics.length;i++){
   tabLayout.addTab(tabLayout.newTab());
   fragments.add(new PageFragment());
  }
  viewPager.setAdapter(new FmPagerAdapter(fragments,getSupportFragmentManager()));
  tabLayout.setupWithViewPager(viewPager);

  for (int j = 0; j < topics.length; j++) {
   tabLayout.getTabAt(j).setText(topics[j]);
  }
 }
}
함정 에 빠 졌 다
모두 가 천편일률 적 으로 setUser Visible Hint()방법 을 사용 하면 된다 고 말 했 지만 이 문 제 는 말 하지 않 았 다.Lazyloadfragment 로 데 이 터 를 불 러 오지 않 았 습 니까?Viewpager 를 사용 하 는 것 은 PagerAdapter 입 니 다.pageradapter 를 사용 하여 디 버 깅 을 중단 합 니 다.setUser Visible Hint()를 호출 하지 않 았 기 때문에 isVisible 인지 false 인지 lazyload 방법 을 실행 하지 않 습 니 다.호출 setUserVisible Hint()를 Fragment PagerAdapter 로 표시 해 야 합 니 다.

Fragment Pager Adapter 를 바 꾼 후 디 버 깅 을 하고 setUser Visible Hint 를 호출 합 니 다.isVisible 은 ture 입 니 다.

총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기