我的安卓系统有3个刷卡标签(A、B、C)。对于选项卡c,我有一个函数RetrieveData()
,用于从MySQL
检索数据并加载到listView
。
假设在mysql中我只有一行数据,当涉及到c时,数据将被加载到listview(仅一个列表)。当我刷到tab a并再次刷到c时,列表现在变成2。
有没有办法让RetrieveData()
只打一次电话?谢谢。
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View edit_details = inflater.inflate(R.layout.edit_work_details, container, false);
// EditDetails = new ArrayList<HashMap<String, String>>();
listViewUpdate = (ListView) edit_details.findViewById(R.id.listViewEdit);
totalHours=(TextView)edit_details.findViewById(R.id.hour);
setHasOptionsMenu(true);
Bundle bundle = this.getArguments();
if (getArguments() != null) {
ID = bundle.getString("ID");
RetrieveData(ID); // retrieve data from MySQL
}
Toast.makeText(getActivity(), "Details" + ID, Toast.LENGTH_LONG).show();
}
标签适配器
public class TabsFragmentPagerAdapter extends FragmentPagerAdapter {
public TabsFragmentPagerAdapter(FragmentManager fm) {
super(fm);
// TODO Auto-generated constructor stub
}
@Override
public Fragment getItem(int index) {
// TODO Auto-generated method stub
if(index == 0) {
Fragment fragment=new A();
Bundle bundle = new Bundle();
bundle.putString("ID", Edit.ID);
fragment.setArguments(bundle);
return fragment;
}
if(index == 1) {
Fragment fragment = new B();
Bundle bundle = new Bundle();
bundle.putString("ID", Edit.ID);
fragment.setArguments(bundle);
return fragment;
}
if(index == 2) {
Fragment fragment = new C();
Bundle bundle = new Bundle();
bundle.putString("ID", Edit.ID);
fragment.setArguments(bundle);
return fragment;
}
return null;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return 3;
}
}
viewpager代码
public class ActivityB extends ActionBarActivity implements ActionBar.TabListener {
private ViewPager viewPager;
private ActionBar actionBar;
private TabsFragmentPagerAdapter tabsAdapter;
private String[] item = new String[]{"Information","Work Force","Work Details"};
private String id;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_b);
// id=getIntent().getExtras().getString("ID");
viewPager = (ViewPager) findViewById(R.id.viewPager);
tabsAdapter = new TabsFragmentPagerAdapter(getSupportFragmentManager());
viewPager.setAdapter(tabsAdapter);
actionBar = getSupportActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
for(int i=0; i<4; i++){
actionBar.addTab(actionBar.newTab().setText(item[i]).setTabListener(this));
}
viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageSelected(int arg) {
// TODO Auto-generated method stub
actionBar.setSelectedNavigationItem(arg);
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub
}
@Override
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub
}
});
}
@Override
public void onTabReselected(ActionBar.Tab arg0, FragmentTransaction arg1) {
// TODO Auto-generated method stub
}
@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction arg1) {
// TODO Auto-generated method stub
viewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(ActionBar.Tab arg0, FragmentTransaction arg1) {
// TODO Auto-generated method stub
}
}
这是我的账单
在再次刷到a和c之后
好像又在叫
RetrieveData
。 最佳答案
您应该使用setOffscreenPageLimit
的ViewPager
。它将设置您首先要加载多少页寻呼机。
setOffscreenPageLimit的默认值是1,因此它将加载当前页和下一页。在您的情况下,它将加载A
和B
,当您从C
移动到B
时,它将破坏A
的实例。
尝试使用
`pager.setOffscreenPageLimit(2)`
它将加载当前页和另外2页,因此A、B和C将加载一次。
编辑
设置应保留在
视图层次结构中处于空闲状态的当前页。超出此范围的页面
需要时,将从适配器重新创建限制。
这是作为优化提供的。如果你事先知道号码
中需要支持或具有延迟加载机制的页
放置在页面上,调整此设置可以在
感知页面动画和交互的平滑性。如果你有
少量的页面(3-4)可以同时保持活动状态,
新创建的视图子树的布局将花费更少的时间
用户来回翻页。
Source
很明显,这意味着您可以设置要在初始级别加载的页数,如果要在第一次运行时加载5页,请将其值设置为4。
现在,如果您将从5个页面中的任何一个页面移动,则不会调用
onCreateView()
的Fragment
,因为它在初始阶段已经加载。