2012-05-22 12 views
8

Ho bisogno di una soluzione per l'implementazione di visualizzazione del cercapersone. In primo luogo sto caricando enormi dati dal database in una singola pagina, quindi a volte durante lo scorrimento rallenta la frequenza di scorrimento (è necessario scorrere più volte sulla pagina) come in background sta eseguendo l'attività di recupero. Non sto utilizzando un'attività asincrona per restituire la vista. Esiste un modo per caricare le pagine pigre, basta consentire all'utente di andare su un'altra pagina con lo scorrimento, ma i dati sono pigri.dati di caricamento Android in modo asincrono in visualizzazione pager

Il mio esempio di codice è come indicato di seguito;

public Object instantiateItem(View container, int position) { 

View v; 

v = View.inflate(context,R.layout.swipearea, null); 

listView = (ListView)v.findViewById(R.id.MyListView); 
largeDataCall(); 
((ViewPager)container).addView(v); 
return v; 
} 

Sto chiamando questo in metodo di creazione.

pager=(ViewPager) findViewById(R.id.pagerAdapter); 
pager.setAdapter(new SimplePager(MyPager.this)); 
pager.setCurrentItem(364); 

C'è qualche soluzione?

risposta

0

Non penso che ci sia un modo per scaricare i dati pigri nel modo sincrono che descrivi. AsyncTask è la strada da percorrere o forse potresti usare direttamente i thread. Credo che AsyncTask sia stato progettato specificamente per questo tipo di funzionalità. È più facile da usare quindi direttamente il thread. Se avete bisogno di idee sull'implementazione, date un'occhiata a: http://geekjamboree.wordpress.com/2011/11/22/asynctask-call-web-services-in-android/

+1

Non riesco a vedere alcuna implementazione di visualizzazione del cercapersone nel collegamento specificato. – Hanry

+0

Per visualizzare l'esempio di cercapersone è possibile vedere: http://developer.android.com/reference/android/support/v4/app/FragmentPagerAdapter.html e http://android-developers.blogspot.in/2011/08/horizontal -view-strisciata-con-viewpager.html. È necessario collegare questo tipo di implementazione con AsyncTask per ottenere un'esperienza utente ottimale. –

17

Suggerirei di lavorare con Frammenti (e non direttamente con le viste).

è necessaria un'interfaccia sui vostri frammenti per dire loro quando vengono mostrati:

public interface IShowedFragment { 

    public void onShowedFragment(); 
} 

fare tutti i tuoi frammenti implementano tale interfaccia, e in quel chiamata di metodo tuoi caricatori/asyncTasks compiti/sfondo.

Quindi inserire un onPageChangeListener sul ViewPager e quando si rileva che l'utente ha modificato la pagina, chiamare il metodo dell'interfaccia sul frammento. Hai alcune scelte con questo listener, con uno dei metodi che puoi aspettare che il viewPager si fermi per far scattare la tua chiamata di interfaccia.

Per poter ottenere il frammento corretto per effettuare questa chiamata, prelevare il frammento dall'oggettoFragmentApadter.instantiateItem (ViewGroup, int) che restituirà il frammento per quella posizione se è già caricato.

mPager.setOnPageChangeListener(new OnPageChangeListener() { 

    @Override 
    public void onPageSelected(int position) { 

     Fragment fragment = (Fragment) mAdapter.instantiateItem(mPager, position); 
     if(fragment instanceof IShowedFragment){ 
      ((IShowedFragment) fragment).onShowedFragment(); 
     } 
    } 
    (...) 

Come che è possibile preparare i frammenti con vista vuoto e quando si fa scorrere su uno, si inizia a caricare i dati.

+0

Avete qualche esempio di implementazione? – Hanry

+3

Frammenti renderebbe la vita molto più facile. Se li hai implementati in un frammento, puoi caricare i dati (in modo asincrono) quando vuoi, quindi visualizzarli su createView() di Fragment. http://developer.android.com/reference/android/support/v13/app/FragmentStatePagerAdapter.html – DeeV

+1

Aggiunta di un'implementazione (manca solo un esempio di frammento, dove onShowedFragment() dovrebbe essere implementato e caricare i dati in modo sincrono) . – galex

1

instantiateItem viene chiamato quando lo ViewPager sta per scambiare e richiede una vista. non ha per creare effettivamente tutto. Penso che alla fine il carico pigro sia fuori. Per come la vedo io, ci sono due cose che devi fare qui.

1: Memorizza i dati in background quando l'utente sta per raggiungere la tua pagina. Il tuo esempio afferma che 364 pagine (buon Dio), quindi direi che usi un listener per gestire le modifiche alle pagine. Quando sei alla pagina 363, inizia a caricare i dati per 364. Quando sei su 364, inizia a caricare i dati su 365 e mantieni i dati a 363 nel caso in cui l'utente voglia tornare indietro. Se i dati vengono caricati in tempi relativamente brevi o se l'utente impiega molto tempo per lo scambio, dovrebbe sembrare che si stia utilizzando asyncTask o thread per caricare i dati.

2: dispone di una vista predefinita di backup che non viene popolata fino a quando i dati non vengono recuperati. Dovrai farlo anche con l'opzione 1 nel caso in cui l'utente carichi la pagina prima di recuperare i dati.Fondamentalmente, basta avere una vista che dice "caricamento ..." o qualcosa fino a quando non si dispone dei dati. O quello, o popolare i dati in tempo reale mentre lo ottieni. In tal caso l'utente lo vedrà costruire.

In entrambi i casi, penso che sarà necessario memorizzare nella cache qualcosa per rendere l'app un bell'aspetto.

+0

Nel registro posso vedere che la visualizzazione del cercapersone inizia a caricare i dati per 363,364,365 contemporaneamente quando ho impostato l'elemento corrente su 364.quindi non c'è un problema per il primo caricamento ma come i passaggi utente, diciamo da 364 a 365 viewpager inizia a caricare i dati per pagina 366 ma se i dati nella pagina 366 sono molto alti allora posso vedere la vista si blocca per pochi secondi. – Hanry

+0

Questo significa che stai caricando i dati in modo sincrono per tre diverse pagine sul thread dell'interfaccia utente, due delle quali non sono nemmeno visibili. Inoltre, metà del tuo lavoro è finito. Usa una discussione e dovrebbe accelerare notevolmente le cose. – DeeV

+0

Hai ancora bisogno di una visualizzazione predefinita "non ancora completata" nel caso in cui non hai recuperato tutti i tuoi dati quando l'utente fa scorrere. – DeeV

0

Hai esaminato android ignition library? secondo Sample-applications c'è un componente "Endless List" e un componente http-cache.

Io ho mai provato io stesso e Non so se questa è una soluzione per voi-appena visto gli esempi .....

3

Ho appena completato un compito molto simile. Per iniziare a trovare la soluzione al tuo problema, considera i seguenti punti in ordine;

  1. guardare se avete bisogno di essere il recupero tutto di tali dati in prima istanza. Sentiti libero di postare alcuni dettagli su quali informazioni hai bisogno di caricare e cosa stai facendo con esso (visualizzandolo come un elenco sullo schermo?)
  2. Guardare utilizzando CursorLoader s che eseguono operazioni di sollevamento pesanti come mentre il database recupera in modo asincrono. This tutorial sull'interwebs introduce l'approccio ContentProvider Android. Meglio familiarizzare con l'URI Android ufficiale e la documentazione di ContentProvider se questi termini non significano molto.
  3. Se si sta lavorando con Fragments - Guardare utilizzando il FragmentStatePagerAdapter invece del tradizionale FragmentPagerAdapter. Non ho usato questo adattatore ma ho letto che crea solo un'istanza del frammento attualmente visibile, cioè non quei frammenti a destra oa sinistra della scheda attualmente selezionata.
  4. Cerca di ottimizzare la query che stai eseguendo sul DB.
+0

Accetto con DeeV. Questo compito diventerà più facile (e più standard) se i frammenti sono stati utilizzati per ogni ViewPager, pagina. Quando verrà visualizzato il frammento verrà chiamato onCreateView, che è il punto in cui è possibile inizializzare il '' '' CursorLoader''' ecc per l'accesso db asincrono e l'interfaccia utente apparentemente perfetta. Questo è certamente possibile in contrasto con i commenti di cui sopra poiché molti, molti altri lo hanno fatto. – OceanLife

1

Ho avuto un problema simile. Un viewpager che caricava dati pesanti. Se non cambierai spesso le viste delle singole pagine, ti suggerirei di tenere le pagine in memoria. Utilizzare seguente codice per eseguire questa

mViewPager.setOffscreenPageLimit(#pages); to keep #pages in memory. I had 5 pages so my #pages was 4. 

Se si desidera aggiornare i dati sugli scivoli viewpager, utilizzare

mViewPager.getAdapter().notifyDataSetChanged(); with getItemPosition() returning POSITION_NONE. 

E usare FragmentStatePagerAdapter.

Problemi correlati