最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android仿今日頭條多個(gè)fragment懶加載的實(shí)現(xiàn)

 更新時(shí)間:2017年12月01日 14:11:25   作者:翻滾吧李博  
我們在做應(yīng)用開發(fā)的時(shí)候,一個(gè)Activity里面可能會(huì)以viewpager(或其他容器)與多個(gè)Fragment來組合使用,下面這篇文章主要給大家介紹了關(guān)于利用Android仿今日頭條多個(gè)fragment懶加載的相關(guān)資料,需要的朋友可以參考下。

前言

最近有時(shí)間,所以我又雙叒叕推新一篇文章了,fragment懶加載實(shí)現(xiàn)雖然是個(gè)小模塊,但做過的人都有體會(huì),通常并不會(huì)輕易就成功了的,讓你輾轉(zhuǎn)反側(cè),徹夜難眠,綿綿無絕期。我就按照今日頭條的樣式做了一個(gè)懶加載功能。文章到一半會(huì)解釋大家可能遇到的不加載數(shù)據(jù)了的坑,先不劇透。

Fragment的生命周期回顧

github代碼直通車 (本地下載

這里是今日頭條效果:


自制效果,有圖有真相:


實(shí)現(xiàn)思路:

使用Fragment類自帶方法setUserVisibleHint()判斷當(dāng)前fragment是否對用戶可見,根據(jù)回調(diào)的isVisibleToUser參數(shù)來進(jìn)行相關(guān)的邏輯判斷。重寫該方法,創(chuàng)建變量isVisible拿到是否可見標(biāo)志。

但是直接根據(jù)isVisible判斷就加載數(shù)據(jù),可能onCreateView()方法并未執(zhí)行完畢,此時(shí)就會(huì)出現(xiàn)NullPointerException空指針異常。所以就需要滿足控件初始化完成,用戶可見,才能加載數(shù)據(jù)。


LazyloadFragment懶加載fragment實(shí)現(xiàn):

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這個(gè)boolean值表示:該Fragment的UI 用戶是否可見,獲取該標(biāo)志記錄下來
  if(isVisibleToUser){
   isVisible = true;
   isCanLoadData();
  }else{
   isVisible = false;
  }
 }

 private void isCanLoadData(){
  //所以條件是view初始化完成并且對用戶可見
  if(isInitView && isVisible ){
   lazyLoad();

   //防止重復(fù)加載數(shù)據(jù)
   isInitView = false;
   isVisible = false;
  }
 }

 /**
  * 加載頁面布局文件
  * @return
  */
 protected abstract int setContentView();

 /**
  * 讓布局中的view與fragment中的變量建立起映射
  */
 protected abstract void init();

 /**
  * 加載要顯示的數(shù)據(jù)
  */
 protected abstract void lazyLoad();

}

子fragment加載數(shù)據(jù):

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[]{"推薦","熱點(diǎn)","北京","視頻","社會(huì)","圖片"};
 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]);
  }
 }
}

坑來了

大家千篇一律地說用setUserVisibleHint()方法就可以了,但是沒有說這個(gè)問題。是不是用了Lazyloadfragment不加載數(shù)據(jù)了?因?yàn)槟阌玫氖荲iewpager用的是PagerAdapter,用pageradapter,打斷點(diǎn)調(diào)試,根本就沒有調(diào)用setUserVisibleHint(),所以isVisible還是false,不執(zhí)行l(wèi)azyload方法。需要用FragmentPagerAdapter顯示調(diào)用setUserVisibleHint()。


換上FragmentPagerAdapter后調(diào)試,調(diào)用setUserVisibleHint,isVisible為ture了。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

最新評論

北川| 乐至县| 崇礼县| 宁化县| 乌鲁木齐市| 长宁县| 冀州市| 靖州| 化隆| 东丽区| 若尔盖县| 耿马| 江华| 宾川县| 镇沅| 金华市| 彭水| 伽师县| 黄平县| 惠安县| 滦南县| 塔城市| 淄博市| 金川县| 诸城市| 日土县| 莒南县| 阳朔县| 盐亭县| 平顶山市| 富川| 石嘴山市| 奇台县| 中西区| 西乌珠穆沁旗| 宁强县| 滁州市| 墨江| 枣强县| 赤壁市| 商洛市|