我有一个Fragment
包含 a 的ViewPager
,现在ViewPager
包含 3 个不同的项目,即每个项目(页面)都包含 aListView
并且每个列表都拥有它Adapter
,我不能使用FragmentPagerAdapter
正弦ViewPager
生活在一个Fragment
。
我应该加载所有三个ListViews
数据Fragment
并将其传递给PagerAdapter
吗?
我有一个Fragment
包含 a 的ViewPager
,现在ViewPager
包含 3 个不同的项目,即每个项目(页面)都包含 aListView
并且每个列表都拥有它Adapter
,我不能使用FragmentPagerAdapter
正弦ViewPager
生活在一个Fragment
。
我应该加载所有三个ListViews
数据Fragment
并将其传递给PagerAdapter
吗?
public abstract class BaseLazyFragment extends Fragment {
protected boolean isVisible;
/**
* to judge if is visible to user
* @param isVisibleToUser
*/
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if(getUserVisibleHint()) {
this.isVisible = true;
onVisible();
} else {
this.isVisible = false;
onInvisible();
}
}
/**
* when the fragment is not visible to user
*/
protected void onInvisible() {
Loggy.e("do onInvisible");
}
/**
* when the fragment is visible to user
*
* lazyload
*/
protected void onVisible() {
Loggy.e("do onVisible---");
lazyLoad();
}
protected abstract void lazyLoad();
}
然后您可以创建一个客户片段扩展 BaseLazyFragment 例如
public class NewsFragment extends BaseLazyFragment {
private boolean isPrepared;
//a flag to judge init action has finished
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_news_page,null);
//do init
// when init is finish , set flag true;
isPrepared = true;
lazyLoad();
return view;
}
@Override
protected void lazyLoad() {
// according this judge, can prevent nullpointerexception
if(!isPrepared || !isVisible){
return;
}
// assignment the view
// get data from network assignment to varible
}
}
设置用户可见提示()
片段创建时 setUserVisibleHint() 方法第一次比 onCreateView() 头,所以由于 oncreateView() 没有被调用,所以lazyLoad() 方法可能会抛出 NullPointerException,所以你应该创建一个标志变量 --> isPrepared。
onCreateView()
实际上,这取决于您要加载的数据有多大?
如果它很大,请尝试下载 ie。每页 10 个项目,并将该数据传递给适配器并缓存它。之后,实施惰性加载器(例如在 google play 应用程序中),它会为您的正确页面下载下一个项目,而不是全部。
所以你所有的三个页面都会在第一次加载时显示数据,如果用户想要更多,他可以导航到列表底部,按“加载更多”并获取更多项目:)
根据我的经验,这个解决方案效果很好。当然这种加载器应该采用服务器端。
还有更多的考虑,即。也许您的数据“非常活跃”。所以你必须考虑一下。