我的安卓系统有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

    }

}

这是我的账单
android - 停止在标签中调用函数-LMLPHP
在再次刷到a和c之后
android - 停止在标签中调用函数-LMLPHP
好像又在叫RetrieveData

最佳答案

您应该使用setOffscreenPageLimitViewPager。它将设置您首先要加载多少页寻呼机。
setOffscreenPageLimit的默认值是1,因此它将加载当前页和下一页。在您的情况下,它将加载AB,当您从C移动到B时,它将破坏A的实例。
尝试使用

`pager.setOffscreenPageLimit(2)`

它将加载当前页和另外2页,因此A、B和C将加载一次。
编辑
设置应保留在
视图层次结构中处于空闲状态的当前页。超出此范围的页面
需要时,将从适配器重新创建限制。
这是作为优化提供的。如果你事先知道号码
中需要支持或具有延迟加载机制的页
放置在页面上,调整此设置可以在
感知页面动画和交互的平滑性。如果你有
少量的页面(3-4)可以同时保持活动状态,
新创建的视图子树的布局将花费更少的时间
用户来回翻页。
Source
很明显,这意味着您可以设置要在初始级别加载的页数,如果要在第一次运行时加载5页,请将其值设置为4。
现在,如果您将从5个页面中的任何一个页面移动,则不会调用onCreateView()Fragment,因为它在初始阶段已经加载。

07-28 05:14