欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

前言

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

Fragment的生命周期回顧

github代碼直通車 (本地下載

這里是今日頭條效果:


自制效果,有圖有真相:


實現(xiàn)思路:

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

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


LazyloadFragment懶加載fragment實現(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這個boolean值表示:該Fragment的UI 用戶是否可見,獲取該標志記錄下來
  if(isVisibleToUser){
   isVisible = true;
   isCanLoadData();
  }else{
   isVisible = false;
  }
 }

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

   //防止重復加載數(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[]{"推薦","熱點","北京","視頻","社會","圖片"};
 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()方法就可以了,但是沒有說這個問題。是不是用了Lazyloadfragment不加載數(shù)據(jù)了?因為你用的是Viewpager用的是PagerAdapter,用pageradapter,打斷點調(diào)試,根本就沒有調(diào)用setUserVisibleHint(),所以isVisible還是false,不執(zhí)行l(wèi)azyload方法。需要用FragmentPagerAdapter顯示調(diào)用setUserVisibleHint()。


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

總結

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

相關文章

最新評論