Android cargar datos asincrónicamente en vista pager

Necesito una solución para la implementación del buscapersonas. En primer lugar estoy cargando los datos enormes de la base de datos en una sola página, así que a veces durante el golpe que se ralentiza la frecuencia de desplazamiento (se necesita varias veces deslizar en la página) como en el fondo que está haciendo la tarea de búsqueda. No estoy utilizando tarea asíncrona para volver a ver. ¿Hay alguna manera de páginas de carga perezosa sólo permitir al usuario ir a otra página en el golpe, pero los datos son perezosos cargado.

Mi ejemplo de código es como a continuación;

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; } 

Estoy llamando a esto en el método de creación.

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

¿Hay alguna solución?

Yo sugeriría trabajar con Fragmentos (y no directamente con vistas).

Necesitas una interfaz en tus fragmentos para decirles cuándo se muestran:

 public interface IShowedFragment { public void onShowedFragment(); } 

Haga que todos sus fragmentos implementen esa interfaz y, en ese método, llame a las tareas loaders / asyncTasks / background.

A continuación, coloque un onPageChangeListener en su ViewPager, y cuando detecte que el usuario cambió la página, llame al método de interfaz en su fragmento. Usted tiene algunas opciones con este oyente, con uno de los métodos que usted puede esperar para que el viewPager deje de deslizar para activar su llamada de interfaz.

Para poder obtener el fragmento correcto para realizar esta llamada, tome el fragmento de yourFragmentApadter.instantiateItem (ViewGroup, int) que devolverá el fragmento para esa posición si ya está cargado.

 mPager.setOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageSelected(int position) { Fragment fragment = (Fragment) mAdapter.instantiateItem(mPager, position); if(fragment instanceof IShowedFragment){ ((IShowedFragment) fragment).onShowedFragment(); } } (...) 

Al igual que usted puede preparar sus fragmentos con vistas vacías y cuando se deslice sobre uno, usted comienza a cargar los datos.

Acabo de terminar una tarea muy similar. Para empezar a encontrar la solución a su problema, considere los siguientes puntos en orden;

  1. Mira si necesitas buscar todos esos datos en primera instancia. Siéntase libre de enviar de nuevo con algún detalle en cuanto a qué información necesita cargar y qué está haciendo con ella (mostrándola como una lista en la pantalla?)
  2. Observe usando CursorLoader s que realizan tareas de levantamiento pesado tales como la búsqueda de bases de datos de forma asincrónica. Este tutorial sobre interwebs introduce el enfoque de ContentProvider Android. Lo mejor es familiarizarse con la documentación oficial de URI de Android y ContentProvider si esos términos no significan mucho.
  3. Si está trabajando con Fragmentos – Mire usando el FragmentStatePagerAdapter lugar del FragmentPagerAdapter tradicional. No he utilizado este adaptador pero he leído que instancia solamente el fragmento visible actualmente, es decir no esos fragmentos a la derecha oa la izquierda de la lengüeta seleccionada actualmente.
  4. Observe la optimización de la consulta que está ejecutando en el DB.

Tuve un problema similar. Un viewpager que cargaba datos pesados. Si no va a cambiar las vistas de las páginas individuales a menudo, entonces le sugiero que mantener las páginas en la memoria. Utilice el siguiente código para realizar este

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

Si desea actualizar datos en las diapositivas de

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

Y utilizar FragmentStatePagerAdapter.

No creo que haya ninguna forma de datos de carga perezosa en la forma síncrona que describen. AsyncTask es el camino a seguir o tal vez podría usar hilos directamente. Creo que AsyncTask fue diseñado específicamente para este tipo de funcionalidad. Es más fácil de usar entonces el hilo directamente. Si necesita ideas sobre la implementación, eche un vistazo a: http://geekjamboree.wordpress.com/2011/11/22/asynctask-call-web-services-in-android/

instantiateItem se llama cuando ViewPager está a punto de intercambiar y necesita una vista. No tiene que crear realmente todo. Creo que en última instancia, la pereza de carga está fuera. De la manera que lo veo, hay dos cosas que necesitarás hacer aquí.

1: Cache los datos en segundo plano cuando el usuario está a punto de llegar a su página. Su ejemplo afirma que 364 páginas (buen Señor), así que yo diría que usar un oyente para manejar los cambios de página. Cuando esté en la página 363, empiece a cargar los datos para 364. Cuando esté en 364, comience a cargar los datos en 365 y mantenga los datos en 363 en caso de que el usuario desee volver a intercambiar. Si los datos se cargan con relativa rapidez o el usuario tarda mucho tiempo en intercambiarse, debe ser asombroso suponiendo que esté utilizando asyncTask o hilo para cargar los datos.

2: Tener una vista predeterminada de copia de seguridad que no se rellena hasta que se recuperen los datos. Tendrá que hacer esto con la opción 1, así en caso de que el usuario cargue la página antes de recuperar los datos. Básicamente, sólo tiene una vista que dice "cargando …" o algo así hasta que tenga los datos. O bien, o llenar los datos en tiempo real a medida que lo obtenga. En ese caso, el usuario lo verá construir.

De cualquier manera, creo que necesitará almacenar en caché algo para que la aplicación se vea bien.

¿Has mirado en la biblioteca de encendido de Android ? De acuerdo con las aplicaciones de ejemplo hay un componente "Endless List" y un componente http-cache.

No he probado yo mismo y no sé si esto es una solución para usted, sólo vio los ejemplos …..

  • ¿Por qué mi fragmento onCreate se llama extensivamente cada vez que una página a través de mis aplicaciones viewPager?
  • Actualizar ViewPager dinámicamente?
  • Fragment.onCreateView () no se llama en viewpager después del cambio de configuración
  • Recuperar un fragmento de un ViewPager
  • Error al inflar TextInputLayout cuando se utiliza con ViewPager
  • Viewpager + FragmentpagerAdapet + Fragmentos + ListView = aplicación insanamente lenta
  • ViewPager omitir las vistas de devolución dejando en blanco
  • ViewPagerIndicator CirclePageIndicator no se puede instanciar
  • Los datos anteriores se muestran en ViewPager Android
  • Cómo deslizar las pestañas dentro de un fragmento de cajón de navegación
  • Android: RecyclerView dentro del viewpager vertical
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.