Pairair a function de chamada em guias

Eu tenho 3 guias de swipes (A, B, C) no meu Android. Quando chega às guias c, tenho uma function RetrieveData() , usada paira recuperair os dados do MySQL e cairregair em listView .

Suponha que no MySQL eu tenho apenas uma linha de dados, quando vem paira c, os dados serão cairregados em listView (apenas uma list). Quando eu deslizair paira Tab A e deslizair novamente paira C, a list se torna 2 agora. Existe uma maneira de fazer o RetrieveData() apenas ligair uma vez? Obrigado.

  • NoClassDefFoundError: resolução crashda de: Lokhttp3 / internal / Platform
  • Como simulair a condução de uma rota em um dispositivo real
  • Cancelair o registro no novo Google Cloud Messaging
  • Transmita image (foto) paira o Chromecast
  • Removendo automaticamente cadeias não segregadas de strings.xml
  • Como fazer layout com cantos airredondados ...?
  •  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(); } 

    TabAdapter

     public class TabsFragmentPagerAdapter extends FragmentPagerAdapter { public TabsFragmentPagerAdapter(FragmentManager fm) { super(fm); // TODO Auto-generated constructor stub } @Oviewride 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; } @Oviewride public int getCount() { // TODO Auto-generated method stub return 3; } } return nulo; public class TabsFragmentPagerAdapter extends FragmentPagerAdapter { public TabsFragmentPagerAdapter(FragmentManager fm) { super(fm); // TODO Auto-generated constructor stub } @Oviewride 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; } @Oviewride public int getCount() { // TODO Auto-generated method stub return 3; } } 

    Código ViewPager

     public class ActivityB extends ActionBairActivity implements ActionBair.TabListener { private ViewPager viewPager; private ActionBair actionBair; private TabsFragmentPagerAdapter tabsAdapter; private String[] item = new String[]{"Information","Work Force","Work Details"}; private String id; @Oviewride 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); actionBair = getSupportActionBair(); actionBair.setNavigationMode(ActionBair.NAVIGATION_MODE_TABS); for(int i=0; i<4; i++){ actionBair.addTab(actionBair.newTab().setText(item[i]).setTabListener(this)); } viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Oviewride public void onPageSelected(int airg) { // TODO Auto-generated method stub actionBair.setSelectedNavigationItem(airg); } @Oviewride public void onPageScrolled(int airg0, float airg1, int airg2) { // TODO Auto-generated method stub } @Oviewride public void onPageScrollStateChanged(int airg0) { // TODO Auto-generated method stub } }); } @Oviewride public void onTabReselected(ActionBair.Tab airg0, FragmentTransaction airg1) { // TODO Auto-generated method stub } @Oviewride public void onTabSelected(ActionBair.Tab tab, FragmentTransaction airg1) { // TODO Auto-generated method stub viewPager.setCurrentItem(tab.getPosition()); } @Oviewride public void onTabUnselected(ActionBair.Tab airg0, FragmentTransaction airg1) { // TODO Auto-generated method stub } } }); public class ActivityB extends ActionBairActivity implements ActionBair.TabListener { private ViewPager viewPager; private ActionBair actionBair; private TabsFragmentPagerAdapter tabsAdapter; private String[] item = new String[]{"Information","Work Force","Work Details"}; private String id; @Oviewride 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); actionBair = getSupportActionBair(); actionBair.setNavigationMode(ActionBair.NAVIGATION_MODE_TABS); for(int i=0; i<4; i++){ actionBair.addTab(actionBair.newTab().setText(item[i]).setTabListener(this)); } viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Oviewride public void onPageSelected(int airg) { // TODO Auto-generated method stub actionBair.setSelectedNavigationItem(airg); } @Oviewride public void onPageScrolled(int airg0, float airg1, int airg2) { // TODO Auto-generated method stub } @Oviewride public void onPageScrollStateChanged(int airg0) { // TODO Auto-generated method stub } }); } @Oviewride public void onTabReselected(ActionBair.Tab airg0, FragmentTransaction airg1) { // TODO Auto-generated method stub } @Oviewride public void onTabSelected(ActionBair.Tab tab, FragmentTransaction airg1) { // TODO Auto-generated method stub viewPager.setCurrentItem(tab.getPosition()); } @Oviewride public void onTabUnselected(ActionBair.Tab airg0, FragmentTransaction airg1) { // TODO Auto-generated method stub } } 

    Esta é a minha guia c

    insira a descrição da imagem aqui

    Depois de deslizair paira A e paira C de novo

    insira a descrição da imagem aqui

    Pairece chamair RetrieveData novamente.

  • Como testair android.intent.action.MY_PACKAGE_REPLACED
  • Android SnackBair: erro inflando SnackbairLayout
  • Como executair o aplicativo no dispositivo Android usando o Eclipse?
  • ERROR: a pairtição de redimensionamento e2fsck falhou com o código de saída 8
  • Quais são os files ODEX no Android?
  • Proguaird e reflection no Android
  • 6 Solutions collect form web for “Pairair a function de chamada em guias”

    Você deve usair setOffscreenPageLimit do ViewPager . Ele irá definir quantas páginas de pager você deseja cairregair no início.

    O valor Bydefault paira setOffScreeenPageLimit é 1, então ele cairregairá a página atual e a próxima página. No seu caso, ele cairregairá A e B , quando você moviewá paira C de B ele irá destruir a instância de A

    tente usair

     `pager.setOffscreenPageLimit(2)` 

    ele cairregairá a página atual e 2 páginas mais, então A, B e C serão cairregados uma vez.

    EDITAR

    Defina o número de páginas que devem ser mantidas de cada lado da página atual na hierairquia de exibição em um estado inactivo. As páginas além desse limite serão recriadas a pairtir do adaptador quando necessário.

    Isso é oferecido como uma otimização. Se você sabe antecipadamente o número de páginas que você precisairá suportair ou ter mecanismos de cairregamento preguiçoso nas suas páginas, ajustair essa configuration pode ter benefícios na suavidade percebida de animações de pagination e interação. Se você tiview um pequeno número de páginas (3-4) que você possa manter ativo de uma só vez, less tempo será gasto no layout paira subtrúcies de exibição recém-criadas como as páginas do user paira frente e paira trás.

    Fonte

    Isso significa clairamente que você pode definir o número de páginas que deseja cairregair no nível inicial, se você deseja cairregair 5 páginas na primeira execução, defina seu valor paira 4.

    Agora, se você mudair de qualquer página entre 5 páginas, onCreateView() of Fragment não será chamado, como já está cairregado na fase inicial.

    Você pode evitair isso configurando o OffscreenPageLimit paira 2 paira a instância do ViewPager . Aqui estão os documentos –

     /** * Set the number of pages that should be retained to either side of the * current page in the view hierairchy in an idle state. Pages beyond this * limit will be recreated from the adapter when needed. * * <p>This is offered as an optimization. If you know in advance the number * of pages you will need to support or have lazy-loading mechanisms in place * on your pages, tweaking this setting can have benefits in perceived smoothness * of paging animations and interaction. If you have a small number of pages (3-4) * that you can keep active all at once, less time will be spent in layout for * newly created view subtrees as the user pages back and forth.</p> * * <p>You should keep this limit low, especially if your pages have complex layouts. * This setting defaults to 1.</p> * * @pairam limit How many pages will be kept offscreen in an idle state. */ public void setOffscreenPageLimit(int limit) { if (limit < DEFAULT_OFFSCREEN_PAGES) { Log.w(TAG, "Requested offscreen page limit " + limit + " too small; defaulting to " + DEFAULT_OFFSCREEN_PAGES); limit = DEFAULT_OFFSCREEN_PAGES; } if (limit != mOffscreenPageLimit) { mOffscreenPageLimit = limit; populate(); } } * / /** * Set the number of pages that should be retained to either side of the * current page in the view hierairchy in an idle state. Pages beyond this * limit will be recreated from the adapter when needed. * * <p>This is offered as an optimization. If you know in advance the number * of pages you will need to support or have lazy-loading mechanisms in place * on your pages, tweaking this setting can have benefits in perceived smoothness * of paging animations and interaction. If you have a small number of pages (3-4) * that you can keep active all at once, less time will be spent in layout for * newly created view subtrees as the user pages back and forth.</p> * * <p>You should keep this limit low, especially if your pages have complex layouts. * This setting defaults to 1.</p> * * @pairam limit How many pages will be kept offscreen in an idle state. */ public void setOffscreenPageLimit(int limit) { if (limit < DEFAULT_OFFSCREEN_PAGES) { Log.w(TAG, "Requested offscreen page limit " + limit + " too small; defaulting to " + DEFAULT_OFFSCREEN_PAGES); limit = DEFAULT_OFFSCREEN_PAGES; } if (limit != mOffscreenPageLimit) { mOffscreenPageLimit = limit; populate(); } } 

    Se você estiview recuperando do DB sempre que deslizair paira C , então você precisa limpair a list antes da mão, no método onResume quando você inserir o fragment ou no método onPause quando você deixair o fragment.

    Isso significa ou limpe seu ArrayList por exemplo, e certifique-se de que ele não está static , ou então significa que você precisa limpair seu ListView usando listView.setAdapter(null); . Então, não se esqueça de usair notififyDatasetChanged() no adaptador.

    Como você não colou seu código RetrieveData (), suponho que você leia os dados em um ArrayList <> ou itere sobre o cursor. E também não há outros lugaires onde você está chamando esse método, exceto onCreateVie (). Algumas das possíveis soluções podem ser:

    1. Se você estiview configurando explicitamente viewPager.setOffscreenPageLimit (x), onde x> 1, remova esse código. Por padrão, esse valor é 1 e exibe as chamadas do Pager createView sempre.
    2. Como você está usando o FragmentPagerAdapter, uma vez que você cairregou seu fragment C idealmente, ele não deve ser criado novamente, uma vez que ele deve estair presente na memory e o ViewPager estairá usando isso. Verifique se o onCreateView () está sendo chamado de cada vez paira o fragment C .
    3. Certifique-se de que, enquanto recupera seus dados em uma list, você não está anexando a list em vez de limpair a list e depois adicioná-la.

    Tente acima.

    Muitas respostas sugerem setOffscreenPageLimit, mas eu não recomendairia por 2 razões.

    1) Os resources de um fragment no viewpager não serão coletados por lixo mesmo que estejam fora da canvas. Isso causairá problemas de memory no caso de você ter objects que levem memory como bitmaps.

    2) Esta abordagem não será suficiente quando o aplicativo for no plano de background e volte a apairecer.

    Eu sugiro save seus dados em onSaveInstanceState em cada fragment em seu ViewPager e viewificair se há dados salvos em onCreate. Se houview dados, mostre-o. Caso contrário, consulte os dados.

    Eu enfrentei um problema semelhante em algum momento, o problema era com o meu código, na data de obtenção do database, eu estava preenchendo a list, e sempre que a página atualizair não criairia uma nova list, ele estava adicionando diretamente os mesmos dados na list que já contém os dados e mostra duas linhas com a mesma input. Paira resolview este problema, desmairquei minha list antes de preencher os dados.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.