我在应用程序中有一个视图寻呼机,它根据服务器上可用的内容动态填充,即视图中的标签页可变。为此,我创建了一个单独的片段,它绑定到视图寻呼机内的每个选项卡。
我已经填充了这样的viewpager:
List lstFragments = lstFragments = new ArrayList();
lstFragments.add(DetailsFragment.newInstance(cat.getId(), subcategoryId, cat.getName(), subcategoryName, subcategoryIconUrl));
DetailsTabsAdapter pageAdapter = new DetailsTabsAdapter(getChildFragmentManager(), lstFragments);
viewPager.setAdapter(pageAdapter);
默认情况下,viewpager的属性是其前一个片段和下一个片段的加载内容,但我不希望这样。
我想要实现的目标:
如何实现上述功能?
我为实现这一目标所做的工作:
我已经在片段的public View
onCreateView()
生命周期事件中加载了服务器中的内容。内容加载正常,但它
也为其他标签加载内容。
然后我尝试了viewPager.setOffscreenPageLimit(0)
。但它也没有用。
请帮我解决这个问题。 感谢
答案 0 :(得分:1)
您可以在setUserVisibleHint()
中覆盖一个名为Frament
的方法。片段可见时调用。现在,您可以调用该服务以在该方法中加载数据。同时在同一方法中检查数据是否已加载(保存在db中),然后调用服务,否则从保存的数据中加载数据。
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
// check if fragment is visible
if (isVisibleToUser) {
if(mdata == null){
callService();
} else{
loadFromSavedDB();
}
}
}
答案 1 :(得分:1)
问题1
您需要实施public void setUserVisibleHint(boolean isVisibleToUser)
,如下所示:
boolean isDataLoaded = false;
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser && !isDataLoaded ) {
loadData();//Load data from server here
isDataLoaded = true;
}
}
以上代码仅在您的片段对用户可见时加载数据,并且isDataLoaded
标志确保每个片段生命周期内加载一次内容。
问题2
您需要在案例DetailsFragment
中将要显示的数据存储为该片段中的全局数据,并在从服务器加载之前检查其值。也许你可以像下面的代码一样。
boolean isDataLoaded = false;
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser && !isDataLoaded ) {
loadData();//Load data from server here
isDataLoaded = true;
}
else if(isDataLoaded && yourData != null)
{
//Load your data from cache or existing global instance here
}
}
答案 2 :(得分:0)
在片段中调用此
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if(isVisibleToUser){
//Do what you want here`enter code here`
}
}