TabLayout+ViewPager+Fragment实现懒加载
2017-05-25 18:21
309 查看
在开发中经常用到TabLayout+ViewPager+Fragment的组合。如下图所示:
首先介绍一下使用方法:
xml文件
属性说明:
Java 代码
HomePagerAdapter.java
默认情况下,当显示tab1时,tab2已经加载了(已经调用了生命周期的oncreate,oncreateview,onactivitycreate,onresume方法),也就是默认加载当前fragment两边的一个fragment。加载的个数可以通过viewpager.setoffscreenpagelimit方法控制,模式是viewpager.setoffscreenpagelimit(1).最少也就是1,即使设置成0也默认预加载一个。假如现在的需求是要在fragment显示出来的时候才加载数据,那么通过viewpager.setoffscreenpagelimit方法是无法做到控制的。
下面就介绍另外一种方法来实现这种需求:
在实际开发中,可以把上面的代码抽取到BaseFragment中使用。上面这个方法实现了每次fragment显示出来的时候加载数据,但是这样切换回来的时候还会重复加载,我们只需加载一次就好了。所以改进一下:
#tablayout
首先介绍一下使用方法:
xml文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <android.support.design.widget.TabLayout android:id="@+id/tab_layout" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#EF8D11" app:tabIndicatorColor="#EF4A11" app:tabMode="scrollable" app:tabSelectedTextColor="#FFFFFF" app:tabTextAppearance="@style/MyTabLayoutTextAppearance" app:tabTextColor="#FFFFFF" /> <android.support.v4.view.ViewPager android:id="@+id/view_pager" android:layout_width="match_parent" android:layout_height="match_parent" /> |
Android:background="#EF8D11"背景色
app:tabIndicatorColor="#EF4A11"tab文字下方的那条线的颜色
app:tabMode="scrollable"如果tab过多超出屏幕宽度可以水平滚动
app:tabSelectedTextColor="#FFFFFF"tab被选中的时候文字的颜色
app:tabTextColor="#FFFFFF"tab未被选中时文字的颜色
app:tabTextAppearance="@style/MyTabLayoutTextAppearance"自定义字体大小(一般使用默认即可)
1 2 3 | <style name="MyTabLayoutTextAppearance" parent="TextAppearance.AppCompat.Widget.ActionBar.Title.Inverse"> & 4000 lt;item name="android:textSize">12sp</item> </style> |
1 2 34 | private void setTabs() { HomePagerAdapter homePagerAdapter = new HomePagerAdapter(getSupportFragmentManager()); homePagerAdapter.addTab(new FragmentOne(), "tab1"); homePagerAdapter.addTab(new FragmentTwo(), "tab2"); homePagerAdapter.addTab(new FragmentThree(), "tab3"); viewPager.setAdapter(homePagerAdapter); //把tabLayout和Viewpager关联起来 tabLayout.setupWithViewPager(viewPager); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 1415 | package com.jetsun.demo; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentStatePagerAdapter; import java.util.ArrayList; import java.util.List; /** * Overview: */ public class HomePagerAdapter extends FragmentStatePagerAdapter { private List<Fragment> fragments = new ArrayList<>(); private List<String> titles = new ArrayList<>(); public HomePagerAdapter(FragmentManager fm) { super(fm); } public void addTab(Fragment fragment, String title) { fragments.add(fragment); titles.add(title); } @Override public CharSequence getPageTitle(int position) { return titles.get(position); } @Override public Fragment getItem(int position) { return fragments.get(position); } @Override public int getCount() { return fragments.size(); } } |
懒加载机制
默认情况下,当显示tab1时,tab2已经加载了(已经调用了生命周期的oncreate,oncreateview,onactivitycreate,onresume方法),也就是默认加载当前fragment两边的一个fragment。加载的个数可以通过viewpager.setoffscreenpagelimit方法控制,模式是viewpager.setoffscreenpagelimit(1).最少也就是1,即使设置成0也默认预加载一个。假如现在的需求是要在fragment显示出来的时候才加载数据,那么通过viewpager.setoffscreenpagelimit方法是无法做到控制的。下面就介绍另外一种方法来实现这种需求:
1 2 3 4 5 6 7 8 9 10 11 12 13 1415 | package com.jetsun.demo; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import butterknife.Bind; import butterknife.ButterKnife; /** * Overview: */ public class FragmentDemo extends Fragment { @Bind(R.id.recycler_view) RecyclerView recyclerView; @Bind(R.id.swipe_refresh_layout) SwipeRefreshLayout swipeRefreshLayout; //控件是否已经初始化 private boolean isCreateView = false; @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment, null, false); ButterKnife.bind(this, view); initViews(); isCreateView = true; return view; } private void initViews() { //初始化控件 } //此方法在控件初始化前调用,所以不能在此方法中直接操作控件会出现空指针 @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (isVisibleToUser && isCreateView) { lazyLoad(); } } private void lazyLoad() { //加载数据操作 } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); //第一个fragment会调用 if (getUserVisibleHint()) lazyLoad(); } @Override public void onDestroyView() { super.onDestroyView(); ButterKnife.unbind(this); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 1415 | package com.jetsun.demo; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import butterknife.Bind; import butterknife.ButterKnife; /** * Overview: */ public class FragmentDemo extends Fragment { @Bind(R.id.recycler_view) RecyclerView recyclerView; @Bind(R.id.swipe_refresh_layout) SwipeRefreshLayout swipeRefreshLayout; //控件是否已经初始化 private boolean isCreateView = false; //是否已经加载过数据 private boolean isLoadData = false; @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment, null, false); ButterKnife.bind(this, view); initViews(); isCreateView = true; return view; } private void initViews() { //初始化控件 } //此方法在控件初始化前调用,所以不能在此方法中直接操作控件会出现空指针 @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (isVisibleToUser && isCreateView) { lazyLoad(); } } private void lazyLoad() { //如果没有加载过就加载,否则就不再加载了 if(!isLoadData){ //加载数据操作 isLoadData=true; } } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); //第一个fragment会调用 if (getUserVisibleHint()) lazyLoad(); } @Override public void onDestroyView() { super.onDestroyView(); ButterKnife.unbind(this); } } |
相关文章推荐
- Android应用ViewPager和TabLayout动态加载Fragment,并实现view和tab动态刷新。
- TabLayout+ViewPager+Fragment(懒加载)实现导航栏
- TabLayout ViewPager Fragment 实现底部按钮菜单 Fragment 实现懒加载
- 网络判断+xlistview上拉加载、下拉刷新+Tablayout +图片拖拽缩放+数据库存储 3、案例完成思路要求: 模块一:用fragment+viewpager+Tablayout实现页面
- TabLayout+ViewPager+fragment实现懒加载
- TabLayout+ViewPager+Fragment懒加载实现
- TabLayout + ViewPager + Fragment 实现动态框架
- 首页-底部&顶部Tab导航(菜单栏)的实现:TabLayout+ViewPager+Fragment
- 利用TabLayout(5.0新技术)+ViewPager+Fragment方法实现书签导航
- 使用TabLayout、ViewPager和Fragment实现顶部菜单可滑动切换
- TabLayout和ViewPager以及Fragment实现超级简单导航栏
- TabLayout两种添加tab方式,结合ViewPager+Fragment实现常见界面视图
- TabLayout+TabItem+ViewPager+Fragment实现早期微信屏幕滑动效果
- 使用FragmentTabHost+TabLayout+ViewPager实现双层嵌套Tab
- Tablayout+Viewpager+Fragment实现滑动Tab及cannot convert from Fragment1 to Fragment之解决
- TabLayout+Fragment+ViewPager+FragmentStatePagerAdapter实现Tab标签
- TabLayout+ViewPager+Fragment实现顶部或底部导航栏
- SmartTabLayout+PtrFrameLayout+ViewPager+Fragment简单实现
- 【Android】viewpager+fragment+tablayout实现滑动菜单栏
- 使用TabLayout、ViewPager和Fragment实现顶部菜单可滑动切换