안 드 로 이 드 는 오늘 의 톱 여러 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 입 니 다.
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.