国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android仿今日頭條多個fragment懶加載的實現

2019-10-22 18:21:45
字體:
來源:轉載
供稿:網友

前言

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

Fragment的生命周期回顧

fragment,懶加載,懶加載數據,fragment的懶加載

github代碼直通車

這里是今日頭條效果:

fragment,懶加載,懶加載數據,fragment的懶加載

自制效果,有圖有真相:

fragment,懶加載,懶加載數據,fragment的懶加載

實現思路:

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

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

fragment,懶加載,懶加載數據,fragment的懶加載

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]);  } }}

坑來了

大家千篇一律地說用setUserVisibleHint()方法就可以了,但是沒有說這個問題。是不是用了Lazyloadfragment不加載數據了?因為你用的是Viewpager用的是PagerAdapter,用pageradapter,打斷點調試,根本就沒有調用setUserVisibleHint(),所以isVisible還是false,不執行lazyload方法。需要用FragmentPagerAdapter顯示調用setUserVisibleHint()。

fragment,懶加載,懶加載數據,fragment的懶加載

換上FragmentPagerAdapter后調試,調用setUserVisibleHint,isVisible為ture了。

fragment,懶加載,懶加載數據,fragment的懶加載

總結

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


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 镇江市| 莱西市| 吉水县| 城固县| 三门县| 南靖县| 双鸭山市| 阜平县| 龙陵县| 竹山县| 敦煌市| 科尔| 农安县| 巩义市| 普陀区| 疏附县| 理塘县| 鹤岗市| 托克逊县| 边坝县| 炎陵县| 石城县| 鄯善县| 天门市| 峨山| 梨树县| 搜索| 阿拉善右旗| 翁源县| 巴青县| 平南县| 湄潭县| 陆川县| 淮安市| 石柱| 潮安县| 手机| 石渠县| 绵阳市| 宾川县| 大洼县|