ViewPager + Fragment中对Fragment数据懒加载的实现
由于我的底部导航栏是通过ViewPager + Fragment的方式来实现的
这样就有一个问题,那就是ViewPager的预加载问题,一般来说,ViewPager 会预先加载首个Fragment的左边和右边两个fragment,除非左边或者右边没有fragment
这样会造成,如果首先展示的fragment数据量很小,而他旁边的fragment数据量很大,这样就会造成两个一块加载,消耗时间很大,用户体验不好
解决方案:fragment懒加载
我是在数据量大的那个fragment上使用了懒加载,这样就避免了上述那个问题
思路:
只有当 fragment 对用户可见且 fragment 的视图已经加载完成以后,我们才可以做对应的数据加载操作,所以引入两个布尔变量标识
因为是跟 viewPager 相结合,所以在 fragment 中判断对用户是否可见我们重写setUserVisibleHint生命周期方法进行判断
当对用户可见且 view 已经加载完成后,我们在 onResume 方法中做懒加载操作
做完懒加载操作后,记得恢复先前的标识,防止数据重复加载
代码:
public class CommunityFragment extends Fragment {
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_SHOW_TEXT = "text";
private String mContentText;
View rootView=null;
private NestedListView listView;
private List<List<Image>> imagesList;
private boolean isVisible = false;// 对用户是否可见标识
private boolean isViewCreated = false;// view是否已经加载完成标识
public CommunityFragment() {
// Required empty public constructor
}
public static CommunityFragment newInstance(String param1) {
CommunityFragment fragment = new CommunityFragment();
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mContentText = getArguments().getString(ARG_SHOW_TEXT);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
// if (rootView == null && savedInstanceState == null){
// rootView = inflater.inflate(R.layout.activity_community, container, false);
// initView(); //初始化控件
// }
if (rootView == null && savedInstanceState == null){
rootView = inflater.inflate(R.layout.activity_community, container, false);
}
isViewCreated = true;// view 已经加载
return rootView;
}
@Override
public void onResume() {
super.onResume();
lazyLoad();
}
/**
* 延迟加载 - 对用户可见且view已经加载完成
*/
private void lazyLoad() {
if(isVisible && isViewCreated){
loadData();
reset();// 恢复标识,防止重复加载
}
}
/**
* 恢复标记 防止重复加载
*/
private void reset(){
isViewCreated = false;
isVisible = false;
}
/**
* 加载数据操作
*/
private void loadData() {
initView();
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser){
isVisible = true;// 对用户可见
lazyLoad();
}else {
isVisible = false;// 对用户不可见
}
}
public void initView(){
//在这里加载组件,数据等等
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.menu, menu);
}
}