2015-05-14 10 views
9

Nella mia app sto usando la scheda di navigazione usando view pager. Ho in grado di disegnato con successo le schede utilizzando il codice pubblicato su:
Come aggiornare l'elenco ogni volta che le schede vengono modificate in Visualizza il pager

https://github.com/codepath/android_guides/wiki/Sliding-Tabs-with-PagerSlidingTabStrip

Qui ho usato la scheda e vista scorrevole cercapersone sia per ottenere il tabs.Everything navigazione sta lavorando bene, ma l'elenco non sono essere aggiornato quando mi sto spostando verso l'altra scheda. OnResume() viene chiamato anche la variabile lista oggetti viene aggiornata anche durante il debug ma l'elenco visivo non viene aggiornato.

Here i am alcuni frammenti del codice:

Per Tab1: che nel mio caso è scheda attiva

@Override 
    public void onResume() { 
     super.onResume(); 

     if(!internetUtil.isConnectedToInternet(getActivity())){ 
      mSwipeRefreshLayout.setEnabled(false); 
     }else{ 
      mSwipeRefreshLayout.setEnabled(true); 
      new GetUsersFromServerTask().execute(); // Here i am making the network calls 
     } 
} 

Su Tab2: Quale è scheda Archivio

@Override 
    public void onResume() { 
     super.onResume(); 
     new GetUsersArchivedFromServerTask().execute(); // Network calls 
    } 

In MainActivity:

public class MaterialTab extends FragmentActivity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.material_main_sample); 
     ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager); 
     viewPager.setAdapter(new SampleFragmentPagerAdapter(getSupportFragmentManager())); 
     PagerSlidingTabStrip tabsStrip = (PagerSlidingTabStrip) findViewById(R.id.tabs); 
     tabsStrip.setViewPager(viewPager); 
     tabsStrip.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 
      @Override 
      public void onPageSelected(int position) { 
       if(position == 0){ 
        ActiveFragment activeFragment = new ActiveFragment(); 
        final FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
        ft.detach(activeFragment); 
        ft.attach(activeFragment); 
        ft.commit(); 
       } if(position == 1){ 
        ArchiveFragment archiveFragment = new ArchiveFragment(); 
        final FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
        ft.detach(archiveFragment); 
        ft.attach(archiveFragment); 
        ft.commit(); 
       } 
      } 
     }); 
    } 
} 

anche la cosa è quando sto facendo SwipeRefresh allora la lista è sempre aggiornato. Ora sono totalmente confuso perché questo comportamento. Quando faccio scorrere la scheda vengono richiamati gli stessi metodi e la lista non viene aggiornata, ma quando faccio SwipeRefresh viene aggiornato.

Questo è il frammento attivo:

public class ActiveFragment extends Fragment { 

public void updateFragment(){ 
     new GetUsersArchivedFromServerTask().execute(); 
    } 

public class GetUsersArchivedFromServerTask extends AsyncTask<User, Void, String> { 
     @Override 
     protected String doInBackground(Shipment... parmas) { 
      // Log.d(TAG, String.valueOf(shipmentDbHandler.getAllActiveShipments().size())); 
      _userList1 = userDbHandler.getAllActiveUserByToday(DateTimeUtil.getCurrentTime()); 
      return ""; 
     } 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
     } 

     @Override 
     protected void onPostExecute(String str) { 
      // Set the refresh Listener to false after the list has been loaded with new set of data 
      if (mSwipeRefreshLayout.isRefreshing()) { 
       mSwipeRefreshLayout.setRefreshing(false); 
      } 

      if(_userList1.size() == 0){ 
       ViewGroup parentOne = (ViewGroup) viewOne.getParent(); 
       if(parentOne != null){ 
        parentOne.removeView(viewOne); 
       } 
      } 

      if(_shipmentList1.size() > 0){ 
       mShipmentAdapter = new ShipmentAdapter(getActivity(),_userList1,1); 
       shipmentListView1.setAdapter(mShipmentAdapter); 
       setListViewHeightBasedOnChildren(shipmentListView1); 
       ViewGroup parentOne = (ViewGroup) viewOne.getParent(); 
       if(parentOne == null){ 
        mainLayoutOne.addView(viewOne); 
       } 

       mShipmentAdapter.notifyDataSetChanged(); 
      } 
      mSwipeRefreshLayout.setClickable(true); 
     } 
    } 
} 

risposta

4

Utilizzare FragmentStatePagerAdapter per questo.

+0

In ViewPagerAdapter codice miniera sta estendendo FragmentStatePagerAdapter .. – anand

+1

vista frammento carichi cercapersone lato anche, metodo in modo onResume sarà già chiamata, in modo che quando si scorrere a quel frammento poi onResume non chiama di nuovo –

3

Il tuo OnPageChangeListener si sta avvitando con i frammenti. Ogni volta che viene selezionata una pagina, crei un nuovo Fragment e aggiungilo sempre .. cercando di staccare un nuovo Fragment non ancora collegato. È completamente incasinato. Il tuo SampleFragmentPagerAdapter gestirà queste transazioni di frammenti per te. Quindi basta rimuovere il tuo setOnPageChangeListener e tutto dovrebbe andare bene.

0

Provare a usare notifyDataChange o notifyAll

1

Usare questo all'interno del vostro frammento.

@Override 
public void setUserVisibleHint(boolean isVisibleToUser) { 
    super.setUserVisibleHint(isVisibleToUser); 

    if (isVisibleToUser) { 
     // Do your code here 
    } 
} 

Questo metodo viene chiamato ogni volta che la scheda è visibile all'utente. Spero che questo risolva il tuo problema !!!!

+0

grazie per questo. Questa è l'unica cosa che mi ha aiutato nella mia app! – user3079872

3

Ecco una soluzione semplice e funzionante per voi. Sostituisci semplicemente setOnPageChangeListener in questo modo, qui accediamo all'istanza del frammento corrente con l'aiuto di getSupportFragmentManager e facciamo una chiamata al rispettivo metodo del frammento.

tabsStrip.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 
     @Override 
     public void onPageSelected(int position) { 
      Fragment currentFragment = getSupportFragmentManager() 
        .findFragmentByTag(
          "android:switcher:" + R.id.viewpager + ":" 
            + mViewPager.getCurrentItem()); 
      if (currentFragment instanceof ActiveFragment) { 
       ((ActiveFragment) currentFragment).updateFragment(); 
      } else if (currentFragment instanceof ArchiveFragment) { 
       ((ArchiveFragment) currentFragment).updateFragment(); 
      } 
     } 
    }); 

E all'interno del rispettivo frammento inserire il metodo updateFragment().

public void updateFragment() { 
    Toast.makeText(getActivity(), "ActiveFragment", Toast.LENGTH_SHORT) 
      .show(); 
    // make updates over here 
    // new GetUsersArchivedFromServerTask().execute(); // Network calls 
} 

Riferimento link.

+0

Ho provato questo approccio ma dando un'eccezione puntatore nullo per il resto degli elementi – anand

+0

Cosa intendi per "resto degli elementi"? – Chitrang

+0

resto degli elementi significa nel layout ho i pulsanti swipeRefresh .. quindi tutti quelli stanno dando un'eccezione di puntatore nullo – anand

0

Ignora setPrimaryItem() e chiama un metodo refresh() del frammento nella posizione. setPrimaryItem() viene chiamato ogni volta che l'elemento selezionato cambia in viewPager. Può essere chiamato più di una volta, quindi devi gestirlo anche tu. vedi: setPrimaryItem

Spero che questo aiuti.

2
  1. rimuovere onPageSelected(...) codici dal cambio pagina listerner, non c'è bisogno attatch/detatch manualmente, ViewPager prendere questo automaticamente la cura. E anche il tuo SampleFragmentPagerAdapter dovrebbe creare ciascuna istanza di Frammento in getItem(...).

  2. new GetUsersFromServerTask().execute() deve essere richiamato in ciascun frammento onCreateView e quindi aggiornare la vista dopo Asynctask terminata.


Inoltre, si dovrebbe essere a conoscenza di OffscreenPageLimit:

pubblico setOffscreenPageLimit void (int limite)

Impostare il numero di pagine che dovrebbero essere mantenuta su entrambi i lati della la pagina corrente nella gerarchia della vista in uno stato inattivo. Le pagine oltre questo limite verranno ricreate dall'adattatore quando necessario.

Questo è offerto come ottimizzazione. Se si conoscono in anticipo il numero di pagine che è necessario supportare o sono presenti meccanismi di caricamento pigro sulle proprie pagine, la modifica di questa impostazione può avere benefici sulla fluidità percepita delle animazioni di impaginazione e sull'interazione. Se si dispone di un numero ridotto di pagine (3-4) che è possibile mantenere attivo tutto in una volta, verrà impiegato meno tempo nel layout per i sottostrati di visualizzazione appena creati come pagine utente avanti e indietro.

Si consiglia di mantenere questo limite basso, soprattutto se le pagine presentano layout complessi. Questa impostazione di default a 1.

+0

Ho rimosso attaccare e staccare il frammento ma ora nessun metodo viene chiamato all'interno del frammento. Penso che stia mettendo nella cache quei frammenti. – anand

+0

In realtà 'ViewPager' mantiene sempre i vicini nella cache, il che significa che i vicini hanno chiamato insieme al frammento corrente. Quindi, quando ti sposti al vicino, non puoi vedere che si sta aggiornando, in realtà è già stato aggiornato. – Xcihnegn